Combinação do processo de inicialização do Springboot

A sequência de inicialização visa principalmente resolver o método SpringApplication.run()

Uma instanciação da classe SpringApplication

  1. Instanciação da interface BootstrapRegistryInitializer
    1) Carrega a classe de implementação BootstrapRegistryInitializer e a classe SpringFactoriesLoader carrega o arquivo de configuração Resource definido na pasta META-INF/spring.factories para inicializar a lista de recursos Map<ClassLoader, MultiValueMap<String, String>> 2) .
    Load Instancia a classe de implementação de BootstrapRegistryInitializer

  2. ApplicationContextInitializer lê o arquivo de configuração de recursos da classe de implementação e instancia as classes relacionadas
    1) Carrega a classe de implementação ApplicationContextInitializer e a classe SpringFactoriesLoader carrega o arquivo de configuração definido na pasta META-INF/spring.factories. O recurso inicializa o mapa da lista de recursos <ClassLoader , MultiValueMap<String, String>>
    2) Carregue a classe de implementação que instancia ApplicationContextInitializer e o springboot inicia a classe de instanciação integrada:

org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
  1. Leitura e instanciação do arquivo de configuração de recursos da classe de interface ApplicationListener
    1) Carrega a classe de implementação ApplicationListener e a classe SpringFactoriesLoader carrega o arquivo de configuração definido na pasta META-INF/spring.factories. Resource inicializa a lista de recursos Map<ClassLoader , MultiValueMap< String, String>>
    2) Classe de implementação de ApplicationListener, classe de instanciação integrada do springboot
org.springframework.boot.autoconfigure.BackgroundPreinitializer

2. Método de inicialização SpringApplication.run()

  1. this.createBootstrapContext(), executa a chamada da classe de instanciação da interface BootstrapRegistryInitializer.

  2. Instanciação de SpringApplicationRunListeners e invocação de classes de implementação relacionadas
    1) Instancie SpringApplicationRunListeners e inicie o monitoramento de SpringApplicationRunListeners. A
    classe de implementação SpringApplicationRunListeners é carregada pela classe SpringFactoriesLoader e é definida no arquivo de configuração Resource na pasta META-INF/spring.factories. Inicialize a lista de recursos Map<ClassLoader, MultiValueMap<String, String>>
    2) Percorra e chame o método inicial de todos SpringApplicationRunListeners para implementar a inicialização da interface de classe

  3. Instancie ConfigurableEnvironment e defina as informações de configuração do ambiente para inicialização do springboot por ouvintes, bootstrapContext e applicationArguments.

  4. Imprimir faixa

  5. Criar classe ConfigurableApplicationContext

  6. Criar e carregar SpringBootExceptionReporter
    1) Carregar Criar e carregar a classe de implementação SpringBootExceptionReporter, definida no arquivo de configuração Resource na pasta META-INF/spring.factories. Inicializar lista de recursos Map<ClassLoader, MultiValueMap<String, String>> 2). e carregue
    a classe de implementação SpringBootExceptionReporter

  7. Inicialize o contêiner prepareContext
    para preparar o contexto de contexto inicializado com base no ConfigurableApplicationContext, ConfigurableEnvironment, SpringApplicationRunListeners, ApplicationArguments e Banner inicializados
    1) Defina o atributo de contexto da classe de implementação que implementa ApplicationContextInitializer
    2) Defina o atributo de contexto do ouvinte
    3) Defina o Atributo beanFactory para determinar se deve ser feito um loop ao carregar o bean Depende de allowCircularReferences
    4) Defina as propriedades de beanFactory, se deve permitir o atributo de substituição allowBeanDefinitionOverriding de beans com o mesmo nome ao carregar beans, o padrão do springboot é false 5
    ) Defina o atributo de contexto preguiçosoInitialization , configure se deve atrasar o carregamento de beans carregados lentamente.
    6) Crie um BeanDefinitionLoader que carregue beans. E defina o resourceLoader e o ambiente ao carregar o bean

Beans carregados lentamente são usados ​​com a anotação @Lazy. Benefícios do carregamento lento:
Economizando recursos: Quando há um grande número de beans em um aplicativo, inicializar todos os beans de uma vez pode consumir muita memória e tempo de processamento. Através da inicialização lenta, o bean será inicializado somente quando for necessário, o que pode evitar o consumo desnecessário de recursos.
Tempo de inicialização mais rápido: A inicialização lenta pode reduzir o tempo de inicialização do aplicativo porque
os beans são carregados e inicializados somente quando necessário. Para beans maiores ou complexos que não podem ser usados ​​quando o aplicativo é iniciado, a inicialização lenta pode acelerar significativamente o tempo de inicialização.
Resolver dependências circulares: o contêiner Spring pode gerenciar dependências entre beans. Quando há dependências circulares, a inicialização lenta pode ajudar a resolver o problema. Por meio da inicialização lenta, o contêiner Spring
pode resolver e satisfazer dependências entre beans, um por um, em tempo de execução, em vez de descobrir dependências cíclicas não resolvidas durante a fase de inicialização.

  1. Atualizar contexto refreshContext
    1) Determine se o contêiner é aberto ou fechado por meio do método de gancho RegisterShutdownHook
    2) Refresh() do beanFactory
    (1) Defina o pós-processador do BeanFactory e implemente a interface BeanFactoryPostProcessor
    (2) Defina o pós-processador de o bean, implementou a interface BeanPostProcessor
    (3) para inicializar recursos internacionais, implementou a interface HierarchicalMessageSource
    (4) inicializou a prática do contêiner spring, implementou a interface ApplicationEventMulticaster
    (5) onRefresh() atualizou os recursos do tema, implementou a interface HierarchicalThemeSource, criou o ServletContext
    (6) registrou o monitor Ouça o evento ApplicationListener, obtenha a coleção de interface de implementação ApplicationListener, execute o monitoramento de transmissão (classe de implementação da interface ApplicationEventMulticaster) e execute o método excute correspondente; execute o método listener.onApplicationEvent (event); (7) Carregar o
    arquivo de bytecode por meio de bytecode Ao tecer aspectos Aspect dinamicamente, a interface LoadTimeWeaverAware
    (8) carrega a interface LifecycleProcessor instanciada e chama as interfaces relacionadas ao início/parada.
    O Spring também fornece a interface Lifecycle, que contém o método start/stop. Após implementar essa interface, o Spring garantirá que seu método start seja chamado para iniciar o ciclo de vida quando for iniciado, e o método stop será chamado quando o Spring for desligado para encerrar o ciclo de vida. , geralmente usado para configurar o programa em segundo plano, como execução contínua após a inicialização (como pesquisa MQ, etc.). A última etapa da inicialização do ApplicationContext é garantir a realização desta função.
    (9) Chame o mecanismo de evento ContextRefreshedEvent e implemente ApplicationContextEvent para implementar a classe abstrata ApplicationEvent
  2. Imprimir log de inicialização logStartupInfo
  3. Eventos de interface de execução, ApplicationRunner, coleção de eventos de interface CommandLineRunner

fluxograma de inicialização do springboot

Insira a descrição da imagem aqui

springboot cria processo createApplicationContext de contexto

Insira a descrição da imagem aqui

Lista de montagem automática META-INF/spring.factories no módulo de montagem automática spring-boot -autoconfig

Quando o springboot é iniciado, ele começa a carregar o arquivo META-INF/spring.factories no pacote jar e, em seguida, SpringFactoriesLoader.loadFactoryNames carrega a implementação de instanciação da anotação especificada e a classe de implementação da interface para concluir a montagem automática correspondente.
Por exemplo, a anotação @EnableAutoConfiguration na classe de inicialização springbootAplicatin carrega a classe de configuração do assembly; por meio da classe de anotação EnableAutoConfiguration, a classe de configuração na lista de configuração org.springframework.boot.autoconfigure.EnableAutoConfiguration instanciada é carregada.

A descrição da classe de carregamento SpringFactoriesLoader.loadFactoryNames é carregar a classe de acordo com o tipo

 loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader)```
# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer

# Auto Configuration Import Listeners
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener

# Auto Configuration Import Filters
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
org.springframework.boot.autoconfigure.condition.OnBeanCondition,\
org.springframework.boot.autoconfigure.condition.OnClassCondition,\
org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudServiceConnectorsAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,\
org.springframework.boot.autoconfigure.elasticsearch.rest.RestClientAutoConfiguration,\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\
org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\
org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration,\
org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\
org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\
org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\
org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\
org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\
org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\
org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\
org.springframework.boot.autoconfigure.reactor.core.ReactorCoreAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.SecurityRequestMatcherProviderAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\
org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\
org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration,\
org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,\
org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\
org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration

# Failure analyzers
org.springframework.boot.diagnostics.FailureAnalyzer=\
org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\
org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\
org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer,\
org.springframework.boot.autoconfigure.session.NonUniqueSessionRepositoryFailureAnalyzer

# Template availability providers
org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.web.servlet.JspTemplateAvailabilityProvider

Explicação detalhada dos pontos de extensão do springboot

Referência: https://blog.csdn.net/fox9916/article/details/129101918

Acho que você gosta

Origin blog.csdn.net/tian830937/article/details/132819632
Recomendado
Clasificación