In dem Moment, in dem die Frühlingswolke populär ist, ist es sehr verwirrend, wenn Sie die Grundprinzipien nicht verstehen (alles, was Sie sehen, sind Vereinbarungen, die größer als die Konfiguration sind, aber was ist mit dem Prinzip? Warum müssen Sie dies tun?). Die Frühlingswolke wird schnell basierend auf Spring Stiefel gebaut. Heute werfen wir einen Blick auf den Startprozess für Spring Boot Container. (In diesem Artikel wird nicht erläutert, wie der Spring Boot schnell startet. Lesen Sie diese einfach direkt auf der offiziellen Website, dem offiziellen Website -Dokument -Dokument -Flugtickets.)
Spring Boot gibt den Container im Allgemeinen an, um die Hauptmethode zu starten und dann das JAR -Paket in der Befehlszeile zu starten, wie in der folgenden Abbildung gezeigt:
@SpringbootApplicationPublic Class Application {public static void main (String [] args) {SpringApplication.run (application.class, args); }}Hier sind zwei Dinge:
1. @springbootApplication Annotation
2. Springapplication.Run () Statische Methode
Erforschen wir diese beiden Inhalte separat unten.
Der Quellcode lautet wie folgt:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = Filtertype.custom, classes = autoconfigurationExcludeFilter.class)}) public @Interface SpringbootApplication {Kernnotizen:
@SpringbootConfiguration (eigentlich @Configuration): bedeutet, dass dies eine Javaconfig -Konfigurationsklasse ist, Sie können Bohnen, Abhängigkeiten usw. in dieser Klasse anpassen. -》 Dies ist eine einzigartige Annotation für Springboot und wird üblicherweise verwendet.
@EnableAutoConfiguration: Laden Sie mit Hilfe von @import alle Bean -Definitionen, die die automatischen Konfigurationskriterien entsprechen, in den IOC -Container (es wird empfohlen, unter den Root -Paket -Pfad zu platzieren, damit Unterpackungen und Klassen gescannt werden können). -》 Dies erfordert ein detailliertes Graben!
@Componentscan: Automatische Scan -Annotation der Feder, die den Scanbereich definieren und in den IOC -Behälter laden kann. -》 Nicht mehr zu sagen, jeder muss mit den Anmerkungen des Frühlings vertraut sein.
Der Quellcode der Annotation @EnableAutoConfiguration:
@SuppressWarnings ("Abschaltung") @Target (elementtype.type) @Retention (retentionPolicy.runtime) @Documented @Inherited @AutoConfigurationPackage @import (EnableAutoConfigurationImaMPortelector.class) public @Interface EnableAnaNeNeAnaNeNeAnaToconfiguration {kteAnfiguration {kteAnfiguration {{{{{{{{{{{{{{{{{{{ktecon)Der Kern ist wie folgt ein Diagramm der EnableAutoconfigurationImportSelector -Klasse:
Die Kernmethode ist SelectedImports () in der obersten Schnittstelle importsSelector, der Quellcode ist wie folgt:
@Override public String [] selektimports (AnnotationMetadata AnnotationMetadata) {if (! ISenabled (AnnotationMetadata)) {return no_imports; } try {// 1. Laden Sie 483 Konfigurationseigenschaften aus der Meta-Inf/Spring-Autoconfigure-Metadata.Properties-Datei (einige haben Standardwerte), AutoconfigurationMetadata AutoconfigurationMetAdAdata = AutoConfigurationMetAdataloader .loadMetAdaData (this.beanClassLader); AnnotationAttributes Attribute = getAtTributes (AnnotationMetadata); // 2. Holen Sie sich die Annotations -Attributliste <string> configurations = getCandidateConfigurations (AnnotationMetadata, // 3. configurations = remedUlplicate (Konfigurationen); // 4. Entfernen Sie doppelte Konfigurationen = Sortieren (Konfigurationen, AutoconfigurationMetadata); // 5. Sortieren set <string> excludes = getExclusions (AnnotationMetadata, Attribute); // 6. ScheckkexcludedClasses (Konfigurationen, ausgeschlossen); // 7. Überprüfen Sie die ausgeschlossenen Klassenkonfigurationen.Removeall (Ausschlüsse); // 8. Löschen Sie alle Konfigurationen, die ausgeschlossen werden müssen = Filter (Konfigurationen, AutoconfigurationMetadata); // 9. Filter -OnclassCondition (die in der Annotation konfigurierte Annotation wird nur dann wirksam, wenn eine bestimmte Klasse existiert) FiraToconfigurationImPortEvents (Konfigurationen, Excclusionen); // 10. Auslösen Sie die automatischen Konfigurations -Import -Hörereignisereignis -Rückgabekonfigurationen.TOArray (neue String [configurations.size ()]); } catch (ioException ex) {werfen Sie neue IllegalStateException (Ex); }}Hier sind 3 Kernmethoden:
1) LoadMetadata -Lastkonfiguration
In der Tat soll ein Klassenloader geladen werden: Meta-inf/Spring-Autokonfigur-Metadata.Properties (Spring-Boot-Autokonfigur-1.9.9.
2) GetCandIdateConfigurations erhalten Sie die Liste der Standard -Namen der automatischen Konfigurationsklassenname
Automatisch konfigurieren Sie die Soul-Methode, Springfactoresloader.loadfactoryNames Die Konfiguration der automatischen Konfigurationsklasse Key = EnableAutoConfiguration.Class aus der Datei meta-inf/spring.factores (Spring-Boot-Autoconfigure-1.5.Release-Sources.jar).
Protected List <String> getCandidateConfigurations (AnnotationMetadata -Metadaten, AnnotationAttributes Attribute) {// Das ist richtig, die beiden Parameter hier sind nutzlos ... Wer kann es mir erklären ... list <string> configurations = SpringFactoriesloader.loadFactoryNames (GOSPRINGORTORTORTORTORTORTORTORTORTORTORTORTORTORYCLAGE (). Assert.notEmpty (Konfigurationen, "Keine Autokonfigurationsklassen in meta-inf/fing.factores. Wenn Sie" + "eine benutzerdefinierte Verpackung verwenden, stellen Sie sicher, dass die Datei korrekt ist."). Rückgabekonfigurationen; } // Die Rückgabe ist die geschützte Klasse für EnableAutoConfiguration Class <?> GetSPringFactoriesloaderFactoryClass () {return EnableAutoConfiguration.class; }Was hast du tatsächlich erhalten? Die Datei für Spring.Factories lautet wie folgt, die tatsächlich alle Klassen des automatischen Konfigurationsmoduls #Auto Configure erhalten.
# Initializerorg.springframework.context.ApplicationContextInitializer =/org.springframework.boot.autoconfigure.SharedMetadatAreAlfactoryContextinitializer,/org.springFramework.boot.autoconFigure.Leguring.Loging.Loging.Loging.Loging.Loging.Loging.Logging.Antinitinitinit.Loging.Logging.Antinitinitinit.Loging.Antinitinitinitinit.Loging. - Listenersorg.springframework.context.applicationListener =/org.springframework.boot.autoconfigure.backgroundPreinitializer# Auto -Konfiguration importieren Listenersorg.springframework.boot.autoconfigure.autoconfigurationImportListener =/org.springframework.boot.AutoconFigure.Condition.ConditioneValusionReportAutoConfigurationImaMportListener# auto configuration imporation imporation imporation imporation imporation imporation imporation imporation imporation imporation imporation imporation importa Filterorg.springframework.boot.autoconfigure.autoconfigurationImportFilter =/org.springFramework.boot.autoconfigure.condition.onclassCondition# automatische Konfiguration Hier sind alle automatischen Konfigurationsklassen org.springframework.boot.autoconfigure.enableAutoconfiguration =/org.springFramework.boot.autoconfigure.admin.springapplicationAdlicationAdminjmxautokonfiguration,/org.spingFramework.Boot.boot.Autoconfigur. ingframework.boot.autoconfigure.amqp.rabbitautoconfiguration,/org.springframework.boot.autoconfigure.batch.batchautocon Figuration,/org.springframework.boot.autoconfigure.cache.cacheAutoconfiguration,/org.springframework.boot.autoconfigure .Cassandra.Cassandraautokonfiguration,/org.springframework.boot.autoconfigure.cloud.cloudautoconfiguration,/org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoconfiguration OnText.MessagesourceAutoConfiguration,/org.springframework.boot.autoconfigure.context.propertyPlaPlaNeAnoConfiguration,/org.springframework.boot.Autoconfigure.couch.couchbaseAnfigurFigurFigurfaToconfiguration,/ORG.SPRINGRAMEWRAME E.Dao.PersistenceExceptionTranslationAutoconfiguration,/org.springframework.boot.autoconfigure.data.cassandra.cassandr adataautoconfiguration,/org.springframework.boot.autoconfigure.data.cassandra.cassandrarepooriesAutoconfiguration,/o rg.springframework.boot.autoconfigure.data.couchbase.CouchbasedataAutoConfiguration,/org.springframework.boot.autoconfi gure.data.couchbase.couchbaserepositioniesAutoconfiguration,/org.springframework.boot.autoconfigure.data.Elasticsarch.e LasticSearchAutoconfiguration,/org.springframework.boot.autoconfigure.data.Elasticsearch.ElasticsearchDataAutoconfiguration,/org.springFramework.Boot.Autoconfigure.Data.Elasticsarch.ElasticsarchRepoSitorieRepoSitorieRepoSitorieRepoSorieSaitorieSaitorieSaitorieSaitorieSaitorieSaitorieSaitorieSaitorieSaitorieSaitorieSaitorieSaitorieSaitorieSaitorieSaitorieSaitorieSaitorieSaitorieSaitorieSaitorieSaitorieSaitorieSaitoconiNFIGUGURATION, oder ramework.boot.autoconfigure.data.jpa.jparepositoriesAutoconfiguration,/org.springframework.boot.autoconfigure.data.ldap .LdapdataAutoconfiguration,/org.springframework.boot.autoconfigure.data.ldap.ldaprepooriesAutoconfiguration,/org.sppr ingframework.boot.autoconfigure.data.mongo.mongodataautoconfiguration,/org.springframework.boot.autoconfigure.data.mon go.mongorepositoriesAutoconfiguration,/org.springframework.boot.autoconfigure.data.neo4j.neo4jdataautoconfiguration,/oder g.springframework.boot.autoconfigure.data.neo4j.neo4jrepooriesAutoconfiguration,/org.springframework.boot.autoconfig ure.data.solr.solrrepoSoriesAutoconfiguration,/org.springframework.boot.autoconfigure.data.redis.redisautoconfigurati on,/org.springframework.boot.autoconfigure.data.redis.redisrepooriesAutoconfiguration,/org.springframework.boot.auto configure.data.rest.repositoryrestmvcautoconfiguration,/org.springframework.boot.autoconfigure.data.web.springDatawebau toconfiguration,/org.springframework.boot.autoconfigure.elasticsearch.jest.jestautoconfiguration,/org.springframework.b oot.autoconfigure.freemarker.freemarkerautoconfiguration,/org.springframework.boot.autoconfigure.gson.gsonautoconfigura tion,/org.springframework.boot.autoconfigure.h2.h2consolutoconfiguration,/org.springframework.boot.autoconfigure.hateoas.hypermediaAutoconfiguration,/org.sp Ringframework.boot.autoconfigure.hazelcast.hazelcastautoconfiguration,/org.springframework.boot.autoconfigure.hazelcast.hazelcastautoconfiguration,/org.spring ngframework.boot.autoconfigure.hazelcast.hazelcastjpadependencyAutoconfiguration,/org.springframework.boot.autoconfigur E.Info.ProjectInfoAutoConfiguration,/org.springframework.boot.autoconfigure.Integration.IntegrationAutoconfiguration,/o rg.springframework.boot.autoconfigure.jackson.jacksonAutoconfiguration,/org.springframework.boot.autoconfigure.jdbc.dat ASourceAutoConfiguration,/org.springframework.boot.autoconfigure.jdbc.jdbctemplateAutoConfiguration,/org.springframeWor k.boot.autoconfigure.jdbc.jndidatasourceAutoconfiguration,/org.springframework.boot.autoconfigure.jdbc.xadatasourceauto Konfiguration,/org.springframework.boot.autoconfigure.jdbc.datasourcetransactionManAGerautoconfiguration,/org.springfra mework.boot.autoconfigure.jms.jmsautoconfiguration,/org.springframework.boot.autoconfigure.jmx.jmxautoconfiguration,/o rg.springframework.boot.autoconfigure.jms.jndiconnectionFactoryAutoConfiguration,/org.springframework.boot.autoconfigur E.JMS.Activemq.Activemqautoconfiguration,/org.springframework.boot.autoconfigure.jms.aremis.artemisautoconfiguration,/ org.springframework.boot.autoconfigure.flyway.flywayAutoconfiguration,/org.springframework.boot.autoconfigure.groovy.te mplate.groovytemPlateAutoconfiguration,/org.springframework.boot.autoconfigure.jersey.jerseyautoconfiguration,/org.springframework.boot.autoconfigure.joo q.jooqautoconfiguration,/org.springframework.boot.autoconFigure.kafka.kafkaautoconfiguration,/org.springframework.boot.autoconfigure.kafka.kafkaautoconfi guration,/org.springframework.boot.autoconfigure.ldap.embeded.embededDapautoconfiguration,/org.springframework.boot. autoconfigure.ldap.ldapautoconfiguration,/org.springframework.boot.autoconfigure.liquibase.liquibaseAutoconfiguration,/ org.springframework.boot.autoconfigure.mail.mailsenderAutoconfiguration,/org.springframework.boot.autoconfigure.mail.m AilsendervalidatorAutoconfiguration,/org.springframework.boot.autoconfigure.mobile.deviceresolverautokonfiguration,/org .Springframework.boot.autoconfigure.mobile.DevicedelegatingViewResolverautoconfiguration,/org.springframework.boot.auto configure.mobile.SitepreferenceAutoConfiguration,/org.springframework.boot.autoconfigure.mongo.embeded.embededMongoau toconfiguration,/org.springframework.boot.autoconfigure.mongo.mongoautoconfiguration,/org.springframework.boot.autoconf igure.mustache.mustacheAutoconfiguration,/org.springframework.boot.autoconfigure.orm.jpa.HiNNNATEJPAAUTOCONfiguration, /org.springframework.boot.autoconfigure.reactor.reactorautoconfiguration,/org.springframework.boot.autoconfigure.security.securityAutoconfiguration,/org.Spring Framework ngframework.boot.autoconfigure.security.FallbackwebSecurityAutoconfiguration,/org.springframework.boot.autoconfigure.security.oAuth2uth2uth2autoconfiguration ,/org.springframework.boot.autoconfigure.Sendgrid.Sendgridautoconfiguration,/org.springframework.boot.autoconfigure.sendgrid.Sendgridautoconfiguration,/org. springframework.boot.autoconfigure.session.SessionAutoConfiguration,/org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration,/org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration,/org.springframework.bo ot.autoconfigure.social.linkedinautoconfiguration,/org.springframework.boot.autoconfigure.social.twitterAutoconfigurati on,/org.springframework.boot.autoconfigure.solr.Solrautoconfiguration,/org.springframework.boot.autoconfigure.theREAF .Thymeleafautokonfiguration,/org.springframework.boot.autoconFigure.transaction.transactionAutoconfiguration,/org.springFramework.boot.autoconfigure.transaction.jtaautoconFigur.Autoconfigure.Transaction.Boot AlidationAutoconfiguration,/org.springframework.boot.autoconfigure.web.dispatcherServletAutoConfiguration,/org.springf Ramework.boot.Autoconfigure.Web.EmbeddedServletContainAnauconfiguration,/org.springframework.boot.autoconfigure.Web.E ErrormVCAutoConfiguration,/org.springframework.boot.autoconfigure.web.httpencodingAutoConfiguration,/org.springframeWor k.boot.autoconfigure.web.httpMessageConvertersAutoconfiguration,/org.springframework.boot.autoconfigure.web.multiPartaut oconfiguration,/org.springframework.boot.autoconfigure.web.ServerPropertiesAutoconfiguration,/org.springFramework.boot.autoconFigure.Web.WebclientAutoConfiguration,/org.s pringframework.boot.autoconfigure.websocket.websocketautoconfiguration,/org.springframework.boot.autoconfigure.Websocke T.WebsocketMessagingAutoConfiguration,/org.springframework.boot.autoconfigure.webservices.WebservicesAutoConfiguration# Versagen analyzersorg.springframework.boot.diagnostics.failureanalyzer =/org.springframework.boot.autoconfigure.diagnostics SpringFramework.boot.Autoconfigure.jdbc.datasourcebeancreationFailureanalyzer,/org.springframework.boot.autoconfigure.jdbc.hikaridriverconfigurationFailureanalyzer# Vorlage Verfügbarkeit providerorg.springframework.boot.autoconFigure.template.templateAvilabilityProvider =/org.springframework.boot.autoconfigure.fre eMarker.FreemarkerTemPlateAlabilityProvider,/org.springframework.boot.autoconfigure.mustache.mustachetemplateAvailabilityProvi Der,/org.springframework.boot.autoconfigure.groovy.template.groovytemPlateAvailabilityProvider,/org.springframework.boot.autoconf igure.thymeleaf.thymeleAtemplateAverabilityProvider,/org.springframework.boot.autoconfigure.web.jsptemPlateAvariabilabilityProvider
3) Der Filterfilter filter
private list <string> filter (list <string> Konfigurationen, AutoconfigurationMetadata AutoconfigurationMetadata) {Long start time = system.nanotime (); String [] candidates = configurations.toArray (neue String [configurations.size ()]); boolean [] slip = new boolean [kandidaten.length]; boolean übersprungen = false; // Erhalten Sie den automatischen Konfigurationsimport -Interceptor, der filtriert werden muss, es gibt nur eine im Frühjahr. FACTORES -Konfiguration: org.springFramework.boot.autoconfigure.Condition.oncassCondition für (AutoConfigurationImaMportFilter Filter: GetautoConfigurationFilters () {) {{{{{{{{{ellaNethodododododododhose boolean [] match = filter.match (Kandidaten, AutoconfigurationMetadata); für (int i = 0; i <match.length; i ++) {if (! Match [i]) {überspringen [i] = true; übersprungen = wahr; }}} if (! übersprungen) {// solange es eine Missverhältnis gibt -> übersprungen = true, alle Übereinstimmungen -》 übersprungen = false-> direkt zurückgeben, um Konfigurationen zurückzugeben; } List <string> result = new ArrayList <string> (candidaten.length); für (int i = 0; i <candidates.length; i ++) {if (! überspringen [i]) {// match-》 nicht überspringen》 add to result.add (Kandidaten [i]); }} if (logger.istaceEnabled ()) {int numberFiltered = configurations.size () - result.size (); logger.trace ("filtred" + numberFiltered + "Auto -Konfigurationsklasse in" + TimeUnit.nanoseconds.tomillis (System.Nanotime () - StartTime) + "MS"); } NeuarrayList <string> (Ergebnis) zurückgeben; }Springapplication.Run
public configurableApplicationContext run (string ... args) {stopwatch stopwatch = new stopwatch (); stopwatch.start (); ConfigurableApplicationContext context = null; Failureanalyzers Analyzer = NULL; configureHeadlessProperty (); SpringApplicationRunListeners Hörer = getrunListeners (Args); // 1. Holen Sie sich die Hörer-Hörer. Starting ();-> Starten Sie! try {applicationArgumente applicationArgumente = new DefaultApplicationArgumente (Args); Umgebung für Konfigurieren von Umwelt = Vorbereitungsumgebung (Hörer, // 2. Bereiten Sie die Umgebung vor und auslösen Sie die Anwendungsumweltvorbereitung von Ereignisanwendungen); Banner printEdBanner = printbanner (Umgebung); // Drucken Sie das Start -Eingabeaufforderung -Zeichen, Standard -Spring -Zeichen -Diagramm context = createApplicationContext (); // Ein konfigurierbares Anwendungskontextanalysatoren = neue failureAnalyse (Kontext); PrepareContext (Kontext, Umgebung, Hörer, applicationArgumente, // 3. Bereiten Sie den Kontext PrintedBanner vor); RefreshContext (Kontext); // 4. Aktualisieren Sie den Kontext AfterRefresh (Kontext, applicationArgumente); // 5. Nachdem die Kontext-Hörer erfrischt wurden. stopwatch.stop (); if (this.logstartupinfo) {New StartUpInfologger (this.mainApplicationClass) .LogStarted (getApplicationog (), Stoppwatch); } Rückgabekontext; } catch (throwable ex) {HandlerunFailure (Kontext, Zuhörer, Analysatoren, Ex); neue IllegalStateException (Ex) werfen; }}1. GetRunListener Get Hörer (SpringapplicationRunListener)
Es ist eigentlich die SpringapplicationRunListener -Klasse
private SpringApplicationRunListener getrunListener (String [] args) {class <?> [] Typen = new class <?> [] {SpringApplication.class, String []. Klasse}; Neue SpringApplicationRunListener zurückgeben (Logger, GetspringFactorySInstances (SpringApplicationRunListener.Class, Typen, dies, args)); } private <t> Sammlung <? erweitert t> GetSPringFactorySInstances (Klasse <T> Typ) {return GetSPringFactoresInstances (Typ, neue Klasse <?> [] {}); } private <t> Sammlung <? erweitert t> GetSPringFactorySInstances (Klasse <T> Typ, Klasse <?> [] parameterTypes, Objekt ... args) {classloader classLader = thread.currentThread (). getContextClassLoader (); // Set verwenden, um die Einzigartigkeit der Zeichenfolgen festzustellen <string> names = new LinkedHashSet <String> (SpringFactoresloader.loadfactoryNames (Typ, Classloader); // 1. Laden Sie die Liste der Fabriknamensammlungen. AnnotationAwareOrderComparator.sort (Instanzen); // sortieren Sie die Rückgabeinstanzen; }1.1 Fabrikname (loadFactorynames) Laden
Der Klassenlader der aktuellen Klasse erhält die Konfiguration der SpringApplicationRunListener-Klasse aus der Datei meta-inf/fRIND.FACTORES
public static list <string> loadFactorynames (class <?> factoryClass, classloader classloader) {string factoryClassName = factoryClass.getName (); try {Enumeration <URL> urls = (classloader! Liste <String> result = new ArrayList <string> (); while (urls.hasmoreElements ()) {url url = urls.NextElement (); Properties Properties = PropertiesloaderUtils.loadProperties (neue urlresource (URL)); String FactoryClassNames = Properties.getProperty (FactoryClassName); result.addall (arrays.aslist (stringutils.commadelimitedListToStringArray (factoryClassNames))); } Rückgabeergebnis; } catch (ioException ex) {werfen neuer illegalArgumentException ("nicht geladen [" + factoryClass.getName () + "] Fabriken vom Standort [" + factories_resource_location + "]", Ex); }}Schauen wir uns im obigen Bild nach dem Erhalt des Fabrikklassennamens einen Blick auf das, was in meta-inf/fing.Factores definiert ist:
# PropertySource Loadersorg.springframework.boot.env.Propertysourceloader =/org.springframework.Boot.env.PropertieSPropertySourceloader,/org.springFramework.Boot.env.yamlpropertySourcelcelcelcelcelcelcelcelcelcelcelcelcelcelcelcelcelcelcelcelcelcelcelcelcelcelcelcelcelceler# Run Hörer hier, schau hier! ! ! ! org.springframework.boot.springApplicationRunListener =/org.springframework.boot.context.event.eventPublishingRunListener# Anwendungskontext InitializerSorg.springframework.context.ApplicationContextinitializer =/org.springFramework.boot.Context.ConfigurationWarningsApplicationContextInitializer,/org.springFramework.boot.context.Contextid ApplicationContextInitializer,/org.springframework.boot.context.config.delegatingApplicationContextInitializer,/org.springframework.boot.context.embeded.serverportinfoApplicationContextInitializer# Application Listenersorg.springframework.context.ApplicationListener =/org.springframework.boot.ClearcachesapplicationListener,/org.springframework.boot.builder.ParentContextcloserap PlicationListener,/org.springframework.boot.context.FileCodingApplicationListener,/org.springframework.boot.context.config.AnSoutputApplicationListenerListener,/org.springfra mework.boot.context.config.configFileApplicationListener,/org.springframework.boot.context.config.delegatingApplicationListener,/org.springframework.boot.liquibase.liqui BaseServiceloCatorApplicationListener,/org.springframework.boot.logging.classPathloggingApplicationListener,/org.springframework.boot.logging.loggingApplicationListenlistenlisten# Umwelt Post Processororg.springframework.boot.env.EnvironmentPostPostProcessor =/org.springframework.boot.cloud.cloudfoundryvcapenvironmentPostProcessor,/org.springFramework.boot.env.springApplicationJsonenvironmentpostPostPostrocesor# Versagen #springApplicationjsonenvironsVironsVironsVironsVironmentPostPostrocessor# Versagen #springApplicationjsonenviregien Analyzersorg.springframework.boot.diagnostics.failureanalyzer =/org.springframework.boot.diagnostics SpringFramework.boot.Diagnostics.Analyzer.BeannotofRequiredTypeFailureanalyzer,/org.springframework.boot.diagnostics.Analyzer.bindfailureanalyzer,/org.Spr Ingframework.boot.diagnostics.Analyzer.ConnectorStartFailureanalyzer,/org.springframework.boot.diagnostics /org.springframework.boot.diagnostics.analyzer.portinusefailureanalyzer,/org.springframework.boot.diagnostics.Analyzer.validationExceptionfailureanalyzer# FailureAnalysisReporterorg.springframework.boot.diagnostics.FailEanalyseReporter =/org.springframework.boot.Diagnostics.loggingFaileanalyseReporter
Wow, alle diese Klassen haben vollständige Namen, und Schlüssel sind Schnittstellen und Werte sind Implementierungsklassen. Wir erhalten die Implementierungsklasse value = "org.springFramework.boot.springApplicationRunListener" -Anfrage basierend auf der Ereignisrelease und Start des Hörers. Sobald Sie erraten haben, müssen Sie "Reflexion" verwenden, um die Klasseninstanz basierend auf dem Klassennamen zu erhalten. Das Folgende wird schnell verifiziert ...
1.2 Federfabrikinstanzen erstellen
Generieren Sie "EventPublishing Start -Listener" -Fabrikinstanz basierend auf den Namen <string> -Namen (der einzigen Implementierungsklasse EventpublishingRunListener von SpringApplicationrunListener), die im ersten Schritt erhalten wurde
@SuppressWarnings ("Unkontrolliert") private <T> List <T> createSPringFactorySInstances (Klasse <T> Typ, Klasse <?> [] ParameterType, Classloader Classloader, Objekt [] args, set <string> Namen) {List <T> Instances = new ArrayList <T> (Namen. für (String -Name: Namen) {try {class <?> InstanceClass = classutils.forname (Name, Classloader); // Verwenden Sie die Reflexion, um die Klasse zu erhalten. Constructor <?> Constructor = InstanceClass .GetDeclaredConstructor (parameterTypes); // Erhalten Sie den Konstruktor tinstance = (t) Beanutils.instantiateClass (Konstruktor, Args); // Konstruktinstanzen basierend auf den Instanzen für Konstruktor- und Parameter.Add (Instance); } catch (throwable ex) {neue illegalArgumentException werfen ("kann nicht instanziieren" + type + ":" + name, ex); }} Rückgabeinstanzen; }Bereiten Sie den Kontext vor
private void prepareContext (configurableApplicationContext -Kontext, Konfigurationsumweltumgebung, SpringApplicationRunListeners -Hörer, ApplicationArgumente ApplicationArguments, Banner PrintEDBanner) {context.setenvironment (Umgebung); postProcessapplicationContext (Kontext); // Singleton a BeannameGenerator, setzen Sie den Ressourcenoader in den Anwendungskontext an. null); logStartupproFileInfo (Kontext); } // Spring Boot Special Singleton Bean Context.getbeanFactory (). Regietersingleton ("SpringApplicationArgumente", ApplicationArguments); if (printEdBanner! } // Laden Sie die Ressourcenset <Object> Quellen = getources (); Assert.notEmpty (Quellen, "Quellen dürfen nicht leer sein"); Load (Kontext, Quellen.ToArray (neues Objekt [Quellen.Size ()])); listener.contextload (Kontext); // Der Hörer führt die "Kontext geladene" Methode} ausAktualisieren Sie den Kontext
private void refreshcontext (configurableApplicationContext -Kontext) {reprosh (context); // Kernklasse if (this.registerShutdownhook) {try {context.registerShutDownhook (); // Registrieren Sie den Schlusshaken, wenn der Container geschlossen ist. }}} protected void reprosSh (ApplicationContext applicationContext) {assert.issinstanceof (AbstractApplicationContext.class, ApplicationContext); ((AbstractApplicationContext) applicationContext) .refresh (); }Die endgültige Ausführung ist die Aktualisierungsmethode der abstrakten Abstract -Klasse der AbstractApplicationContext.
public void refresh () wirft Beansexception, illegalStateException {synchronisiert (this.startUpShutDownMonitor) {// Bereiten Sie sich darauf vor, die Kontextumgebung zu aktualisieren, z. B. die Vorbereitung und Überprüfung von Systemeigenschaften oder Umgebungsvariablen. prepareReFresh (); // Starten Sie die RefreshbeanFactory -Methode der Unterklasse. Parse xml configurablelistableBeAnfactory beanfactory = actFreshbeanFactory (); // Containerfunktionen für die Beanfactory konfigurieren, z. B. Klassenlader, Ereignishandler usw. PrepeBeArfactory (Beanfactory); Versuchen Sie {// Setzen Sie die Nachverarbeitung der Beanfaktorie. Leere Methode, lassen Sie es für die Erweiterung der Unterklasse. postProcessbeanFactory (beanfactory); // Rufen Sie die Postprozessoren von Beanfactory an, die in der Bean -Definition beim Container registriert sind. InvokeBeArfactoryPostProcessors (Beanfactory); // Registrieren Sie den Postprozessor von Bean und rufen Sie ihn während des Bean -Erstellungsprozesses an. RegisterBeanPostProcessors (Beanfactory); // Initialisieren Sie die Nachrichtenquelle im Kontext, dh Nachrichtenkörper in verschiedenen Sprachen werden international initmessagesource () verarbeitet. // Initialisieren Sie die ApplicationEventMulticaster -Bean, und der Anwendungsereignissieger ist initapplicationEventmulticaster (); // Initialisieren Sie andere spezielle Bohnen, leere Methoden und lassen Sie sie für die Erweiterung der Unterklasse. onrefresh (); // Überprüfen und registrieren Sie die Listener Bean RegisterListeners (); // Instanz alle verbleibenden (nicht-läder-init) Singleton Bean. Finanzierungstätigkeit (Beanfactory); // Containerereignisse veröffentlichen und den Aktualisierungsprozess beenden. findeRefresh (); } catch (beansexception ex) {if (logger.iswarnenabled ()) {logger.warn ("Ausnahme während der Kontextinitialisierung -" + "Aufbrechen Aktualisierungsversuch:" + ex); } // Zerstöre die erstellte Singleton Bean, um den Ressourcenverbrauch zu vermeiden. zerstörungen (); // den Aktualisierungsvorgang abbrechen und das aktive Flag zurücksetzen. CancelRefresh (Ex); // Ausnahme vom Anrufer propagieren. Ex werfen; } endlich {// Zurücksetzen Spring's Core Cache ResetCommonCaches (); }}}Nach dem Erfrischen des Kontextes
Spring Boot bietet zwei Schnittstellen, mit denen Benutzer sich selbst erweitern können: ApplicationRunner und CommandLinerunner. Sie können einige Operationen ausführen, die der Dateninitialisierung ähneln, nachdem der Container gestartet wurde (nachdem der Kontext aktualisiert wurde).
private void callRunners (ApplicationContext -Kontext, applicationArgumente args) {list <Object> runners = new ArrayList <Object> (); Runners.Addall (context.getBeansOftype (applicationRunner.class) .Values ()); // Getall of type applicationRunner aus den Context Runners.addall (context.getBeansOftype (commandLinerununner.class) .Values (); // Getall von Typen -Typ -Befehlsliner von The Conconth von The Contexte, von The Conconth von The Contexte, von The Contexte, von The Conconth von The Contexte, von The Concontioner aus dem Kontext AnnotationAwareOrderComparator.sort (Läufer); // Sortieren für (Objektläufer: Neue LinkedHashset <Object> (Läufer)) {if (Läuferinstanz von applicationRunner) {CallRunner ((ApplicationRunner) Runner, Args); // Execute} if (Runner Instance Commandliner) {Callrunner) {Callruner) (; }}}Die beiden Unterschiede sind, dass die Parameter unterschiedlich sind. Wählen Sie also entsprechend der tatsächlichen Situation selbst.
public interface CommandLinerunner {void run (String ... args) löst Ausnahme aus; } public interface applicationRunner {void run (applicationArguments args) löst eine Ausnahme aus; }Die Ausführungsparameter in commandLinerunner sind die String [] args String -Array -Parameter der ursprünglichen Java -Startklasse -Hauptmethode. Die Parameter in ApplicationRunner werden verarbeitet, um einige Methoden bereitzustellen, wie z. B.:
List <String> GetOptionValues (String -Name);
Holen Sie sich die Wertliste gemäß dem Namen im Befehl Java Startup --Foo = bar - -foo = baz, dann return list ["baz", "baz"] gemäß dem Parameternamen Foo
Gemäß der vorherigen Analyse kann der Startprozess für Spring-Boot-Container in 2 Teile unterteilt werden:
1) Annotation für Ausführung: Scannen Sie die Bohnen im angegebenen Bereich, laden Sie die der automatischen Konfigurationsklasse entsprechenden Bohnen und laden Sie sie in den IOC -Container.
2) Die spezifische Springappliocation.run () in der Man -Methode verläuft durch den SpringapplicationEvent, und es gibt 6 Unterklassen:
ApplicationFailEdEvent.ClassApplicationPrePareDeVent.ClassApplicationReadyEvent.ClassApplicationStarteDEvent.ClassApplicationStartingEvent.ClassspringapplicationEvent.class
Hier verwenden wir das klassische Spring Event-gesteuerte Modell, ein Flugticket: Spring Event-gesteuerte Modell und Observer-Modell
Das Klassendiagramm lautet wie folgt:
Wie im obigen Bild gezeigt, handelt es sich um ein klassisches, event gesteuertes Modell, einschließlich 3 Rollen: Event Publisher, Event und Listener. Entsprechend Frühlingsboot ist:
1. EventPublishingRunListener Diese Klasse verkauft das Ereignisverlag,
2. SpringapplicationEvent ist ein Ereignis, das in Spring-Boot (die 6 oben genannten Ereignisse) definiert ist, die von ApplicationEvent (definiert im Frühjahr definiert) geerbt wurden.
3. 监听者spring-boot并没有实现针对上述6种事件的监听者(我没找到...), 这里用户可以自己实现监听者(上述6种事件)来注入spring boot容器启动流程,触发相应的事件。
例如:实现ApplicationListener<ApplicationReadyEvent>这个接口,在容器启动完毕时最后一步listener.finished时,如果启动没有异常,就会执行!可以做一些数据初始化之类的操作。
Zusammenfassen
The above is the relevant knowledge about spring boot container startup introduced to you by the editor. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!