No momento em que a Spring Cloud é popular, é muito confuso se você não entender os princípios básicos (tudo o que você vê são acordos maiores que a configuração, mas e o princípio? Por que você precisa fazer isso?). O Spring Cloud é rapidamente construído com base na bota da primavera. Hoje vamos dar uma olhada no processo de inicialização de contêineres de inicialização da primavera. (Este artigo não explica como iniciar rapidamente a inicialização da primavera, basta ler aqueles diretamente no site oficial, o site oficial documentar os ingressos aéreos)
A bota de mola geralmente especifica o contêiner para iniciar o método principal e iniciar o pacote JAR na linha de comando, conforme mostrado na figura abaixo:
@SpringbooTApplicationPublic Classe Application {public static void main (string [] args) {springapplication.run (application.class, args); }}Aqui estão duas coisas:
1. Anotação do @SpringBoOTApplication
2. SpringApplication.Run () Método estático
Vamos explorar esses dois conteúdos separadamente abaixo.
O código -fonte é o seguinte:
@Target (elementType.type) @retention (retentionPolicy.Runtime) @Documented @Inherited @springbootconfiguration @enableautoconfiguration @componentsCan (excludeFilters = {@Filter = filtertype.custom, ClasseeexTexEx Filtertype.custom, classes = autoConfigurationExcludeFilter.class)}) public @Interface SpringbootApplication {Notas principais:
@Springbootconfiguration (na verdade @configuration): significa que esta é uma classe de configuração Javaconfig, você pode personalizar feijões, dependências etc. nesta classe. -》 Esta é uma anotação exclusiva para a Spring-Boot e é comumente usada.
@Enableautoconfiguration: Com a ajuda do @Import, carregue todas as definições de feijão que atendem aos critérios de configuração automática no contêiner do IOC (recomenda -se ser colocado no caminho do pacote raiz, para que subpackages e classes possam ser digitalizadas). -》 Isso requer escavação detalhada!
@ComponentsCan: Anotação automática de varredura da primavera, que pode definir a faixa de varredura e carregá -la no contêiner do IOC. -》 Não mais a dizer isso, todos devem estar familiarizados com as anotações da primavera.
O código -fonte da anotação @enableautoconfiguration:
@Suppresswarnings ("depreciação") @target (elementType.type) @retention (retentionPolicy.Runtime) @Documented @Irited @AutoconfigurationPackage @Import (enabautoconfiguricatureselector.class) Public @Interface Habilation (enableAutoconfigurication.class)O núcleo é um diagrama de classe EnableAutoconfigurationImportSelector da seguinte maneira:
O método Core é selecionadoImports () na interface importSelector de interface de nível superior, o código-fonte é o seguinte:
@Override public String [] SelectImports (anoTationMetadata AnoTationMetadata) {if (! IsEnabled (anoTationMetadata)) {return No_imports; } tente {// 1. Carregue 483 Propriedades de configuração do arquivo meta-Inf/spring---Autoconfigure-metadata.properties (alguns têm valores padrão), AutoConfigurationMetadata AutoConfigurationMetadata = AutoConfiguringMetadAlOADER .LoadMetATATATA (thisBeanClanClArn); AnoTationAttributes atributos = getAttributes (ANNOTATIONMETADATA); // 2. Obtenha a lista de atributos de anotação <Sctring> Configurações = getCandidateConFigurações (ANNOTATIONMETADATA, // 3. Obtenha 97 atributos de classes de configuração automáticas); configurações = removeduplicates (configurações); // 4. Remova configurações duplicadas = classificação (configurações, auto -figurationMetadata); // 5. Set Set <String> excludes = getExclusions (anotaçãoMetadata, atributos); // 6. Obtenha CHECKEXCLUDEDCLASSES (EXCIGURAÇÕES, exclui); // 7. Verifique as configurações de classe excluídas.removeall (exclusões); // 8. Exclua todas as configurações que precisam ser excluídas = filtro (configurações, auto -figurationMetadata); // 9. Filtre o OnClassCondition (o configurado na anotação só entrará em vigor quando uma determinada classe existir) FireAutoconfigurationImportEvents (configurações, exclusões); // 10. Acionar a configuração automática de importação de eventos de audição de retorno configurations.toArray (new String [Configurations.size ()]); } catch (ioexception ex) {lança new ilegalStateException (ex); }}Aqui estão 3 métodos principais:
1) Configuração de carga do loadMetadata
De fato, é usar um carregador de classe para carregar: meta-inf/spring-autoconfigure-metadata.properties (spring-boot---- método)
2) GetCandidatEConfigurações Obtenha a lista de nomes de classe de configuração automática suportada padrão
Configure automaticamente o método da alma, os nomes SpringFacoriesLoader.
Lista protegida <string> getCandidateConFigurações (Metadados da anotaçãoMetadata, atributos de anotação atributos) {// Isso mesmo, os dois parâmetros aqui são inúteis ... quem pode explicar para mim ... list <string> Configurações = SpringLoader.loadAnames (GetPringFactoriesLloader Assert.NotEmpty (Configurações, "Nenhuma classe de configuração automática encontrada no meta-inf/spring.factories. Se você" + "estiver usando uma embalagem personalizada, verifique se o arquivo está correto."); retornar configurações; } // O retorno é a classe de atableautoconfiguration classe protegida <?> GetSpringFacoriesLoaderFactoryClass () {return enableAutoconfiguration.class; }O que você realmente obteve? O arquivo Spring.Factories é o seguinte, que na verdade obtém todas as classes do #auto configurar o módulo de configuração automática.
# Initializersorg.springframework.context.ApplicationContextInitializer=/org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,/org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer# Application Ouvintessorg.springframework.context.applicationListener =/org.springframework.boot.autoconfigure.backgroundPreinitializer# Importação automática Lidenersorg.springframework.boot.autoconfigure.autoconfigurationImportListener =/org.springframework.boot.autoconfigure.condition.conditionEvaluationReportAtoconfigurationImportListener# IMPORTAÇÃO AUTO Filtersorg.springframework.boot.autoconfigure.autoconfigurationImportFilter =/org.springframework.boot.autoconfigure.condition.onClassCondition# Auto Configure Aqui estão todas as classes automáticas de configuração automática org.springframework.boot.autoconfigure.EnableAutoConfiguration=/org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,/org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,/org.spr ingframework.boot.autoconfigure.amqp.rabbitautoconfiguration,/org.springframework.boot.autoconfigure.batch.batchautocon figuration,/org.springframework.boot.autoconfigure.cache.cacheautoconfiguration,/org.springframework.boot.autoconfigure .Cassandra.Cassandraautoconfiguration,/org.springframework.boot.autoconfigure.cloud.cloudautoconfiguration,/org.springframework.boot.autoconfigure.contet.configuration.CameReToToconFig.autoconfigure.CoTergingReTerTerStaToConfig. ontext.messagesourCeautoconfiguration,/org.springframework.boot.autoconfigure.context.propertyPlaceHoldreutoconfiguration,/org.springframework.boot.autoconfigure.CouchBase.CouchBaseAtoconfligaturation,/ousCoThort.CouchBase.CouchBaseAtoconfligaturation,/ousCoathort.CouchBase.CouchBase.Autoconfligaturation,/ousCoathwous.CouchBase.CoToToToToT.COOT.Autoconfigure.CouchBase.CoushorToToToToToconMort. e.dao.persistenceExceptionTranslationAutoconfiguration,/org.springframework.boot.autoconfigure.data.casandra.casandr adataautoconfiguration,/org.springframework.boot.autoconfigure.data.cassandra.cassandrarepositorieseautoconfiguration,/o rg.springframework.boot.autoconfigure.data.couchbase.couchbasedataautoconfiguration,/org.springframework.boot.autoconfi gure.data.couchbase.couchBaseRePositorieSautoconfiguration,/org.springframework.boot.autoconfigure.data.elticsearch.e lasticsearchAutoConfiguration,/org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,/org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,/org.springf ramework.boot.autoconfigure.data.jpa.jparepositoriesautoconfiguration,/org.springframework.boot.autoconfigure.data.ldap .LdapDataautoconfiguration,/org.springframework.boot.autoconfigure.data.ldap.ldaprepositorieseautoconfiguration,/org.spr ingframework.boot.autoconfigure.data.mongo.mongodataautoconfiguration,/org.springframework.boot.autoconfigure.data.mon go.mongorepositorieseautoconfiguration,/org.springframework.boot.autoconfigure.data.neo4j.neo4jdataautoconfiguration,/ou g.springframework.boot.autoconfigure.data.neo4j.neo4jrepositorieseautoconfiguration,/org.springframework.boot.autoconfig ure.data.solr.solrrepositorieseautoconfiguration,/org.springframework.boot.autoconfigure.data.redis.redisautoconfigurati ON,/org.springframework.boot.autoconfigure.data.redis.redisrepositorieseautoconfiguration,/org.springframework.boot.auto configure.data.rest.repositoryrestmvcautoconfiguration,/org.springframework.boot.autoconfigure.data.web.springdatawebau TOCONFIGURAÇÃO,/org.springframework.boot.autoconfigure.elasticsearch.jest.jestautoconfiguration,/org.springframework.b oot.autoconfigure.freemarker.freemarkerautoconfiguration,/org.springframework.boot.autoconfigure.gson.gsonAutoconfigura ção,/org.springframework.boot.autoconfigure.h2.h2consoleautoconfiguration,/org.springframework.boot.autoconfigure.hateoas.hypermediaAutoconfiguration,/org.sp ringframework.boot.autoconfigure.hazelcast.hazelcastautoconfiguration,/org.springframework.boot.autoconfigu.hazelcast.hazelcautoconfiguration,/org.spring ngframework.boot.autoconfigure.hazelcast.hazelcastjpadependencyautoconfiguration,/org.springframework.boot.autoconfigur e.info.projectInfoautoconfiguration,/org.springframework.boot.autoconfigure.integration.integationAutoconfiguration,/o rg.springframework.boot.autoconfigure.jackson.jacksonsautoconfiguration,/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 Configuração,/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.embedded.embeddedldapautoconfiguration,/org.springframework.boot. AutoConfigure.ldap.ldapautoconfiguration,/org.springframework.boot.autoconfigure.liquibase.liquibaseeautoconfiguration,// org.springframework.boot.autoconfigure.mail.mailsenderautoconfiguration,/org.springframework.boot.autoconfigure.mail.m AilSenderValidatorAutoconfiguration,/org.springframework.boot.autoconfigure.mobile.deviceresolverautoconfiguration,/org .springframework.boot.autoconfigure.mobile.devicelegatingViewResolverautoconfiguration,/org.springframework.boot.auto Configur.mobile.sitePreferenceAutoconfiguration,/org.springframework.boot.autoconfigure.mongo.embedded.embedmongoau ToConfiguration,/org.springframework.boot.autoconfigure.mongo.mongoautoconfiguration,/org.springframework.boot.autoconf iGure.mustache.mustacheautoconfiguration,/org.springframework.boot.autoconfigure.orm.jpa.hibernatejpaautoconfiguration, /org.springframework.boot.autoconfigure.reactor.reactorautoconfiguration ,/org.springframework.boot.autoconfigure.security.SecurityAutoconfiguration./org.spring arcramework.boot.autoconfigure.security.securityfilterautoconfiguration,/org.springframework.boot.autoconfigure.security.securityfilterautoconfiguration,/org.sPri ngframework.boot.autoconfigure.security.fallbackwebecurityautoconfiguration,/org.springframework.boot.autoconfigure.security.oauth2.oauth2autoconfiguration ,/org.springframework.boot.autoconfigure.sendgrid.sendGridautoconfiguration,/org.springframework.boot.autoconfigure.sendgrid.sendGridaToconfiguration,/org. springframework.boot.autoconfigure.session.sessionAutoconfiguration,/org.springframework.boot.autoconfigure.social.socialwebautoconfiguration,/org.springframework.autoconfigur.socials, ot.autoconfigure.social.linkedinautoconfiguration,/org.springframework.boot.autoconfigure.social.twitterautoconfigurati on,/org.springframework.boot.autoconfigure.solr.solrautoconfiguration,/org.springframework.boot.autoconfigure.thymeleaf .ThymeleafAutoConfiguration,/org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,/org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,/org.springframework.boot.autoconfigure.validation.V AlidationAutoconfiguration,/org.springframework.boot.autoconfigure.web.dispatcherServleTleTleToconfiguration,/org.springf ramework.boot.autoconfigure.web.embeddedservletContainerautoconfiguration,/org.springframework.boot.autoconfigure.web.e errorMvCautoconfiguration,/org.springframework.boot.autoconfigure.web.httpencodingatoconfiguration,/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.websocket.WebSocketMessagingAutoConfiguration,/org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration# Failure analisersorg.springframework.boot.diagnostics.failureanalyzer =/org.springframework.boot.autoconfigure.diagnostics.analyzer.nosuchbeandEfinitionFailuranAlyzer,/Org. springframework.boot.autoconfigure.jdbc.dataSourcebeanCreationFailureanalyzer,/org.springframework.boot.autoconfigure.jdbc.hikaridriverConfigurationFailuranyzer## Disponibilidade do modelo providersorg.springframework.boot.autoconfigure.template.templateAvailabilityProvider =/org.springframework.boot.autoconfigure.fre EMARKER.FREEMARKERTEMPLATEAVAILABILIDADE,/org.springframework.boot.autoconfigure.mustache.mustacheTemplateAvailabilityProvi der,/org.springframework.boot.autoconfigure.groovy.template.groovytemplateavailabilityProvider,/org.springframework.boot.autoconf iGure.Thymeleaf.ThymeleAftemplateAvailabilityProvider,/org.springframework.boot.autoconfigure.web.jsptemplateavailabilityProvider
3) O filtro filtra as condições que não atendem à anotação OnClassCondition
Lista privada <string> filtro (list <string> configurações, auto -figurationMetadata AutoConfigurationMetadata) {long startTime = System.nanotime (); String [] candidates = configureations.toArray (new String [Configurations.size ()]); boolean [] Skip = new boolean [candidatos.length]; Boolean pulado = false; // Obtenha a configuração automática do Interceptor que precisa ser filtrada, existe apenas uma na configuração da primavera.Factories: org.springframework.boot.autoconfigure.condition.OnClassCondition para (filtade); boolean [] MATCH = FILTER.MATCH (candidatos, AutoConfigurationMetadata); for (int i = 0; i <match.length; i ++) {if (! Match [i]) {skip [i] = true; ignorado = true; }}} if (! Skipped) {// desde que haja uma incompatibilidade -> ignorada = true, todas as correspondências -》 Skipped = false-> retornar diretamente para retornar configurações; } List <tring> resultado = new ArrayList <String> (candidates.length); para (int i = 0; i <candidatos.Length; i ++) {if (! Skip [i]) {// Match-》 Não pule }} if (logger.istraceEnabled ()) {int numberFiltered = configurations.size () - result.size (); Logger.Trace ("Filtred" + NumberFiltered + "Classe de configuração automática em" + timeUnit.nanoseconds.tomillis (System.nanotime () - StartTime) + "MS"); } retornar novo ArrayList <String> (resultado); }SpringApplication.Run
public ConfigurableApplicationContext Run (String ... args) {StopWatch StopWatch = new StopWatch (); stopwatch.start (); ConfigurableApplicationContext context = null; Analisadores de Failureanalyzers = NULL; ConfigureheadlessProperty (); SpringApplicationRunListeners ouvintes = getRunListeners (args); // 1. Obtenha os ouvintes ouvintes.starting ();-> Start! tente {ApplicationArguments ApplicationArguments = new DefaultApplicationArguments (args); Ambiente ConfigurableEnvironment = PrepareNvironment (ouvintes, // 2. Prepare o ambiente e acionar o ApplicationEnvironmentPreparedEvent ApplicationArguments ApplicationArguments); Banner PrintEdBanner = PrintBanner (Ambiente); // Imprima o caractere de prompt de inicialização, o diagrama de caracteres padrão contexto do diagrama de caracteres = CreateApplicationContext (); // instanciam um analisador de contexto de aplicação configurável = novo Failureanalyzerzer (contexto); PrepareContext (contexto, ambiente, ouvintes, ApplicationArguments, // 3. Prepare o contexto impresso); refreshContext (contexto); // 4. Atualize o contexto AfterRefresh (contexto, ApplicationArgumment); // 5. Depois de refrescar os ouvintes de contexto. stopwatch.stop (); if (this.logstartupinfo) {new startupInfologger (this.mainApplicationClass) .LogStard (getApplicationLog (), StopWatch); } retornar contexto; } Catch (ex -jogável ex) {HandlerUnfailure (contexto, ouvintes, analisadores, ex); lançar uma nova ilegalStateException (Ex); }}1. GetRunListeners Get Ouvins (SpringApplicationRunListeners)
Na verdade, é a classe SpringApplicationRunListener
privado springApplicationRunListeners getRunListeners (string [] args) {class <?> [] types = nova classe <?> [] {springapplication.class, string []. classe}; Retornar novos SpringApplicationRunListeners (Logger, GetsPringFacoriesInstances (SpringApplicationRunListener.class, Types, This, Args)); } coleta privada <T> <? estende t> getspringFacoriesInstances (classe <T> tipo) {return getsPringFacoriesInstances (tipo, nova classe <?> [] {}); } coleta privada <T> <? estende t> getspringFacoriesInstances (classe <t> tipo, classe <?> [] parameterTypes, objeto ... args) {classLoader classLoader = thread.currentThread (). getContextClassloader (); // Use definido para garantir a exclusividade do conjunto de strings <String> nomes = new LinkedHashSet <String> (SpringFacoriesLoader.LoadFactoryNames (Type, ClassLoader)); // 1. Carregue a lista de coleta de nomes de fábrica <T> Instâncias = CreateSpringFactoriesInstances (Type, ParameterTypes, // 2. AnoTationAWareOrdercomparator.sort (instâncias); // classificar instâncias de retorno; }1.1 Nome da fábrica de carregamento (nomes de loadfactory)
O carregador de classe da classe atual recebe a configuração da classe SpringApplicationRunListener do arquivo meta-inf/spring.factories
Lista estática pública <String> LoadFactoryNames (classe <?> FactoryClass, classe ClassLoader) {String fActórioClassName = FactoryClass.getName (); tente {enumeração <url> urls = (classLoader! = null? ClassLoader.getResources (fábricas_resource_location): classLoader.getSystemResources (fábricas_resource_location)); List <String> resultado = new ArrayList <String> (); while (urls.hasMoreElements ()) {url url = urls.nextElement (); Propriedades Propriedades = PropriedadesloadRutils.loadProperties (New UrlResource (URL)); String factoryclassNames = Properties.getProperty (FactoryClassName); resultado.addall (Arrays.asList (stringUtils.commadelimitedListToStringArray (FactoryClassNames))); } resultado de retorno; } catch (ioexception ex) {tire nova ilegalArgumentException ("Não é possível carregar [" + factoryclass.getName () + "] fábricas de localização [" + fábricas_resource_location + "]", ex); }}Na imagem acima, depois de obter o nome da classe de fábrica, vamos dar uma olhada no que é definido no meta-inf/spring.factories:
# PropertySource carregarsorg.springframework.boot.env.propertysourcelOader =/org.springframework.boot.env.propertiesPropertysourceropertys,/org.springframework.oot.env.yamlPropertySourceroader# Runframework.oot.env.yamlPropertySourcelOADER# RUNLINGENHECIDO# RUNDERWORK.ENV.ENV.Env.yAmlProperCoader, #SpringFramework, ! ! ! org.springframework.boot.springApplicationRunListener =/org.springframework.boot.context.event.eventpublishingRunListener# Application Context Initializersorg.springframework.context.applicationContextInitializer =/org.springframework.boot.context.configurationwarningsapplicationContextInitializer,/org.springframeworkwoot.Context.ContextIdid ApplicationContextInitializer,/org.springframework.boot.context.config.delegatingApplicationContextinitializer,/org.springframework.boot.context.embedded.serverportinfoApplicationContextinitializer# Application Lidenersorg.springframework.context.applicationListener =/org.springframework.boot.clearcachesapplicationlistener,/org.springframework.boot.builder.parentcontextCloserap platiclistener,/org.springframework.boot.context.fileEncodingApplicationListener,/org.springframework.boot.context.config.ansiOutpplicationLicationListener,/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.LoggingApplicationlistener# Environment Post ProcessorSorg.springframework.boot.env.environmentPostProcessor =/org.springframework.boot.cloud.cloudfoundryvcapenvironmentPostProcessor,/org.springframework.env.springApplicationjsonMervamborRArmirMoRMIRMIRMIRGROTOC.env.springApplicationJsonMervamborRArmirMoRMIRMIRGROTOC.env.springApplication, Analisersorg.springframework.boot.diagnostics.failureanalyzer =/org.springframework.boot.diagnostics.analyzer.beanCurrentlyinCreationFailureanalyzer,/Org. springframework.boot.diagnostics.analyzer.beannotofrequiredtypefailureanalyzer,/org.springframework.boot.diagnostics.analyzer.bindfailureanalyzer,/org.spr ingframework.boot.diagnostics.analyzer.connectorstartfailureanalyzer,/org.springframework.boot.diagnostics.analyzer.nouniqueBeandEfinitionFailuranalyzer, /org.springframework.boot.diagnostics.analyzer.portinusefailureanalyzer ,/org.springframework.boot.diagnostics.analyzer.validationexceptionfailuranalzer# FailureanSysisReportersorg.springframework.boot.diagnostics.failureanalysisReporter =/org.springframework.boot.diagnostics.LoggingFailureanAlysisReporter
Uau, todas essas classes têm nomes completos e as chaves são interfaces e os valores são classes de implementação. Obtemos a consulta da classe da classe de implementação = "org.springframework.boot.springapplicationrunlistener" com base na key = "org.springframework.boot.context.event.eventpublishishingRunListener" Release e iniciamos o ouvinte. Depois de adivinhar, você deve usar "reflexão" para obter a instância da classe com base no nome da classe. O seguinte é verificado rapidamente ...
1.2 Crie instâncias de fábrica de primavera
Gere a instância da fábrica "EventPublishing Start Livener" com base nos nomes do conjunto <String> (a única classe de implementação EventPublishingRunListener de SpringApplicationRunListener) obtida na primeira etapa
@Suppresswarnings ("desmarcado") Private <T> Lista <T> CreateSpringFacoriesInstances (classe <t> tipo, classe <?> [] ParameterTypes, classLoader classLoader, objeto [] args, set <sting> nomes) {list <T> instâncias = new Arraylist <T> (names.size (); para (nome da string: nomes) {try {class <?> Instanceclass = Classutils.ForName (nome, classloader); // Use a reflexão para obter a classe assert.isassignable (tipo, InstanceClass); Construtor <?> Construtor = instanceclass .getDecLaredConstructor (parameterTypes); // obtenha o construtor t instância = (t) beanutils.instantiateclass (construtor, args); // constrói instâncias baseadas no construtor e parâmetros instantações (instâncias); } catch (throwable ex) {lança nova ilegalArgumentException ("não pode instanciar" + tipo + ":" + nome, ex); }} retornar instâncias; }Prepare o contexto
private void prepareContext (Contexto ConfigurableApplicationContext, ambiente ConfigurabilyArconment, SpringApplicationRunListeners ouvintes, ApplicationArguments ApplicationArguments, Banner PrintDanner) {Context.setEnvironment (Ambiente); PostProcessApplicationContext (Context); // Singleton Um BeanNameGenerator, defina o ResourceLoader no contexto do aplicativo ApplyInitializers (Context); // Execute os ouvintes inicializer.ContextPrepared (context); nulo); logstartupprofileInfo (contexto); } // Adicione a bota de mola especial Singleton Bean Context.getBeanFactory (). Registeringleton ("SpringApplicationArguments", ApplicationArguments); if (PrintEdBanner! = NULL) {context.getBeanFactory (). Registeringleton ("Springbootbanner", impresso); } // Carregar o conjunto de recursos <ject> fontes = getSources (); Assert.NotEmpty (fontes, "fontes não devem estar vazias"); carga (contexto, fontes.toArray (novo objeto [fontes.size ()])); ouvintes.ContextLoaded (contexto); // O ouvinte executa o método "LOLTADO DE CONTEXTO"}Atualize o contexto
private void refreshContext (ConfigurableApplicationContext Context) {Refresh (context); // classe Core if (this.registershutdowrowook) {try {context.registershutdownHook (); // Registrar o gancho de fechamento, executado quando o contêiner está fechado} captura (AccessCoxceptionException. }}} Void protegido refresh (ApplicationContext ApplicationContext) {Assert.isInstanceof (abstrateApplicationContext.class, ApplicationContext); ((AbstractApplicationContext) ApplicationContext) .Refresh (); }A execução final é o método de atualização da classe abstrata abstratapplicationContext.
public void refresh () lança beansexception, ilegalStateException {sincronizado (this.startupshutdownmonitor) {// Prepare -se para atualizar o ambiente de contexto, como preparar e verificar propriedades do sistema ou variáveis de ambiente. preparerefresh (); // Inicie o método refreshBeanFactory da subclasse. Parses XML ConfigurableListableBeanFactory BeanFactory = obtinFreshBeanFactory (); // Configure os recursos do contêiner para o BeanFactory, como carregador de classe, manipulador de eventos, etc. PrepareBeanFactory (BeanFactory); tente {// Defina o pós-processamento do BeanFactory. Método vazio, deixe -o para expansão da subclasse. PostprocessBeanFactory (BeanFactory); // Ligue para os pós -processadores do Beanfactory, que são registrados no contêiner na definição do feijão. InvokeBeanFactoryPostProcessors (BeanFactory); // Registre o pós -processador de Bean e chamá -lo durante o processo de criação do feijão. RegisterBeanPostProcessors (BeanFactory); // Inicialize a fonte da mensagem no contexto, ou seja, os órgãos de mensagens em diferentes idiomas são processados internacionalmente initMessagesource (); // Inicialize o feijão ApplicationEventMulticaSaster e a emissora de eventos de aplicativo é initApplicationEventMulticaSaster (); // Inicialize outros feijões especiais, métodos vazios e deixe -os para expansão da subclasse. onRefresh (); // verifique e registre o ouvinte Bean RegisterListeners (); // Instância de todos os restantes (sem init-init) feijão singleton. finfactoryInitialização do final (BeanFactory); // Publique eventos de contêiner e encerre o processo de atualização. finalizeRfresh (); } catch (beansexception ex) {if (logger.iswarnenabled ()) {Logger.warn ("Exceção encontrada durante a inicialização do contexto -" + "cancelando tentativa de atualização:" + ex); } // Destrua o feijão Singleton criado para evitar o consumo de recursos. DestroyBeans (); // Cancele a operação de atualização e redefina o sinalizador ativo. cancelrefresh (ex); // propaga a exceção ao chamador. jogar ex; } finalmente {// Redefina o núcleo do cache do Spring ResetCommOncaches (); }}}Depois de refrescar o contexto
O Spring Boot fornece duas interfaces para os usuários se expandirem: ApplicationRunner e CommandLineRunner. Você pode executar algumas operações semelhantes à inicialização dos dados após o início do contêiner (depois que o contexto é atualizado).
Callrunners de void privado (contexto ApplicationContext, ApplicationArguments args) {list <ject> runners = new ArrayList <ject> (); runners.addall (context.getBeansoftype (ApplicationRunner.Class) .Values ()); // Getall of Type ApplicationRunner do contexto runners.addall (context.getbeansoftype (commandlinerunner.class) .values (); : new LinkedHashSet <ject> (runners)) {if (runner instanceof ApplicationRunner) {CallRunner ((ApplicationRunner) runner, args); // execute} if (runner instanceof commandLinerunner) {CallRunner ((CommandlineRunner) runner, args); }}}As duas diferenças são que os parâmetros são diferentes; portanto, escolha por você mesmo de acordo com a situação real.
Public Interface CommandLineRunner {void run (string ... args) lança exceção; } interface pública ApplicationRunner {void Run (ApplicationArguments args) lança exceção; }Os parâmetros de execução no CommandLineRunner são os parâmetros da matriz de string [] args da String [Args String do método principal da classe inicial de inicialização Java; Os parâmetros no ApplicationRunner são processados para fornecer alguns métodos como:
Lista <String> getOptionValues (nome da string);
Obtenha a lista de valores de acordo com o nome, no comando Java Startup - -foo = bar -foo = baz, depois retornar a lista ["bar", "baz"] de acordo com o nome do parâmetro foo
De acordo com a análise anterior, o processo de inicialização de contêineres da Spring-Boot pode ser dividido em 2 partes:
1) Anotação de execução: Digitalize os grãos sob o intervalo especificado, carregue os feijões correspondentes à classe de configuração automática e carregue -os no contêiner do IOC.
2) O SpringAppliocation.run () específico no método Man percorre o SpringApplicationEvent, e há 6 subclasses:
ApplicationFailedEvent.classApplicationPreparedEvent.classApplicationReadyEvent.classApplicationStartedevent.ClassApplicationStartingEvent.ClassSpringApplicationEvent.class
Aqui usamos o modelo clássico de evento da primavera, ingresso aéreo: modelo de mola e modelo de observador orientado por eventos
O diagrama de classe é o seguinte:
Conforme mostrado na figura acima, é um modelo clássico orientado a eventos da primavera, incluindo 3 funções: editor de eventos, eventos e ouvintes. Correspondente ao Spring-Boot é:
1.EventPublishingRunListener Esta classe encapsula a publicação de eventos,
2. SpringApplicationEvent é um evento definido no Spring-Boot (os 6 eventos mencionados acima), herdados do ApplicationEvent (definido na primavera)
3. 监听者spring-boot并没有实现针对上述6种事件的监听者(我没找到...), 这里用户可以自己实现监听者(上述6种事件)来注入spring boot容器启动流程,触发相应的事件。
例如:实现ApplicationListener<ApplicationReadyEvent>这个接口,在容器启动完毕时最后一步listener.finished时,如果启动没有异常,就会执行!可以做一些数据初始化之类的操作。
Resumir
The above is the relevant knowledge about spring boot container startup introduced to you by the editor. I hope it will be helpful to you. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!