天天看點

SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass

前言

源碼主要按照SpringBoot啟動流程順序跟蹤,翻譯部分重要注釋,并解釋重要源碼

SpringApplication 啟動

類注釋

SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass

啟動步驟

SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass

在初始化之前,會對啟動類裡的成員變量進行指派,然後進行初始化

SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass

primarySources:傳入的primarySources裡是在main方法裡邊傳入的主類名稱SpringDataApplication,将其轉換為集合對象放入集合中。

WebApplicationType

SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass
SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass

初始化的WebApplicationType為servlet

getSpringFactoriesInstances

SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass

這一步是為了初始化spring工廠的執行個體,傳入參數為ApplicationContextInitializer.class(Spring上下文初始化的類),傳回一個Collection集合

SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass

在該方法裡,首先拿到ClassLoader,然後加載FactoryNames,加載類型(type)為ApplicationContextInitializer,類加載器(classLoader)為剛剛拿到的類加載器,傳回值放入一個Set中,為的是確定沒有重複的FactoryName,這是因為在之後加載的兩個spring.factories配置檔案中有兩個重複的FactoryName。

繼續跟蹤

SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass

這一步是為了使用給定的ClassLoader去給定的FACTORIES_RESOURCE_LOCATION中加載全部的工廠類

SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass

可以看到,加載的配置檔案在META-INF下,名稱為spring.factories,該配置檔案一共有兩個,且配置檔案中,每個段落第一行為Key,後邊為value,讀取時會通過key将所有的value拿出來

在配置檔案中我們發現,key和value都是包名加類名的字元串,是以Springboot在讀取檔案後,是通過反射生成的類

SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass

該配置檔案内容如下:

# PropertySource Loaders
org.springframework.boot.env.PropertySourceLoader=\
org.springframework.boot.env.PropertiesPropertySourceLoader,\
org.springframework.boot.env.YamlPropertySourceLoader

# Run Listeners
org.springframework.boot.SpringApplicationRunListener=\
org.springframework.boot.context.event.EventPublishingRunListener

# Error Reporters
org.springframework.boot.SpringBootExceptionReporter=\
org.springframework.boot.diagnostics.FailureAnalyzers

# Application Context Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer,\
org.springframework.boot.context.ContextIdApplicationContextInitializer,\
org.springframework.boot.context.config.DelegatingApplicationContextInitializer,\
org.springframework.boot.rsocket.context.RSocketPortInfoApplicationContextInitializer,\
org.springframework.boot.web.context.ServerPortInfoApplicationContextInitializer

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.ClearCachesApplicationListener,\
org.springframework.boot.builder.ParentContextCloserApplicationListener,\
org.springframework.boot.cloud.CloudFoundryVcapEnvironmentPostProcessor,\
org.springframework.boot.context.FileEncodingApplicationListener,\
org.springframework.boot.context.config.AnsiOutputApplicationListener,\
org.springframework.boot.context.config.ConfigFileApplicationListener,\
org.springframework.boot.context.config.DelegatingApplicationListener,\
org.springframework.boot.context.logging.ClasspathLoggingApplicationListener,\
org.springframework.boot.context.logging.LoggingApplicationListener,\
org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener

# Environment Post Processors
org.springframework.boot.env.EnvironmentPostProcessor=\
org.springframework.boot.cloud.CloudFoundryVcapEnvironmentPostProcessor,\
org.springframework.boot.env.SpringApplicationJsonEnvironmentPostProcessor,\
org.springframework.boot.env.SystemEnvironmentPropertySourceEnvironmentPostProcessor,\
org.springframework.boot.reactor.DebugAgentEnvironmentPostProcessor

# Failure Analyzers
org.springframework.boot.diagnostics.FailureAnalyzer=\
org.springframework.boot.diagnostics.analyzer.BeanCurrentlyInCreationFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.BeanDefinitionOverrideFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.BeanNotOfRequiredTypeFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.BindFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.BindValidationFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.UnboundConfigurationPropertyFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.ConnectorStartFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.NoSuchMethodFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.NoUniqueBeanDefinitionFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.PortInUseFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.ValidationExceptionFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.InvalidConfigurationPropertyNameFailureAnalyzer,\
org.springframework.boot.diagnostics.analyzer.InvalidConfigurationPropertyValueFailureAnalyzer

# FailureAnalysisReporters
org.springframework.boot.diagnostics.FailureAnalysisReporter=\
org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter

           
SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass

該配置檔案内容如下:

# 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.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveRestClientAutoConfiguration,\
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.rsocket.RSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\
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.security.rsocket.RSocketSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration,\
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.flyway.FlywayMigrationScriptMissingFailureAnalyzer,\
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

           

進入loadSpringFactories

SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass
SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass

讀取完spring.factories後,把讀取到的内容(13個key)存儲到枚舉類中,然後周遊枚舉類,将裡邊内容都add到一個map(result)裡邊去

最後把classloader以及周遊的結果都放入cache中,提高加載資源的效率

繼續跟蹤,傳回getSpringFactoriesInstances

SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass

發現ApplicationContextInitializer的size為7,去上面spring.factories配置檔案中找key=ApplicationContextInitializer,對應的value的确為7個

目前已經取出所有的配置,但還沒有進行初始化

接下來建立執行個體對象

createSpringFactoriesInstances

SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass
SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass

這裡通過反射建立上述7個ApplicationContextInitializer執行個體

sort

SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass

最後對7個執行個體進行排序,傳回執行個體對象

setInitializers

SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass
SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass

将初始化的執行個體放入ArrayList中

getSpringFactoriesInstances

SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass

接下來又是一個getSpringFactoriesInstances,這次傳入參數為ApplicationListener.class,加載監聽器執行個體

操作和上一個getSpringFactoriesInstances類似,這裡不做贅述

deduceMainApplicationClass

SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass

推斷主函數

SpringBoot 2.2.2 源碼(一):構造方法初始化前言SpringApplication 啟動WebApplicationTypegetSpringFactoriesInstancescreateSpringFactoriesInstancessortsetInitializersgetSpringFactoriesInstancesdeduceMainApplicationClass

追溯堆棧資訊,反射拿到main類

以上便是SpringBoot初始化流程

更多詳細源碼注釋資訊請跳轉SpringBoot源碼詳解(一)