SpringBoot啓動流程源碼解析

SpringBoot啓動流程源碼解析

SpringApplication 的職責是建立一個ApplicationContext
SpringFactoriesLoader加載相似於SPI機制
Spring會去找META-INF/spring.factories文件(文件存在多個),找到對應的實現類的全類名進行加載java

SpringApplication建立ApplicationContext`的過程

SpringApplication.initialize()

推斷WebEnvironment,

javax.servlet.Servlet
org.springframework.web.context.ConfigurableWebApplicationContext spring會去判斷這倆個類是否都存在,都存在的話就會設置webEnvironment爲Trueweb

初始化ApplicationContextInitializer

經過SpringFactoriesLoader加載機制,將 org.springframework.context.ApplicationContextInitializer對應的Context進行加載 > org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer > org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer > org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer > org.springframework.boot.context.ContextIdApplicationContextInitializer > org.springframework.boot.context.config.DelegatingApplicationContextInitializer > org.springframework.boot.context.embedded.ServerPortInfoApplicationContextInitializerspring

初始化Listener

經過SpringFactoriesLoader加載機制,將org.springframework.context.ApplicationListener對應的Listener進行加載bootstrap

org.springframework.boot.autoconfigure.BackgroundPreinitializer org.springframework.cloud.bootstrap.BootstrapApplicationListener org.springframework.cloud.bootstrap.LoggingSystemShutdownListener org.springframework.cloud.context.restart.RestartListener org.springframework.boot.ClearCachesApplicationListener org.springframework.boot.builder.ParentContextCloserApplicationListener 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.liquibase.LiquibaseServiceLocatorApplicationListener org.springframework.boot.logging.ClasspathLoggingApplicationListener org.springframework.boot.logging.LoggingApplicationListenerui

推斷擁有main方法的類

Spring會拿當前線程的堆棧信息,而後遍歷堆棧中的方法幀,查看是否有方法名等於main的方法幀spa

SpringApplication.run()

加載SpringApplicationRunListener

SpringApplicationRunListener會在在SpringApplicationrun()方法中建立ApplicationContext的各個步驟作相應的處理 SpringApplicationRunListenersSpringApplicationRunListener 的集合類 SpringApplicationRunListeners類負責管理在SpringApplicationrun()方法中建立ApplicationContext的各個步驟,一共有5個步驟,starting()->environmentPrepared()->contextPrepared()->contextLoaded()->finished(),在每一個步驟中會調用具體的SpringApplicationRunListener實現類去作相應的事情命令行

經過SpringFactoriesLoader加載機制,將org.springframework.boot.SpringApplicationRunListener對應的SpringApplicationRunListener進行加載線程

EventPublishingRunListenerrest

  • 執行SpringApplicationRunListeners.start()方法 在該方法中利用了SpringApplicationRunListener實現類EventPublishingRunListenerApplicationListener實現類廣播了ApplicationStartedEvent事件

響應了ApplicationStartedEvent事件的ApplicationListener org.springframework.boot.logging.LoggingApplicationListener org.springframework.boot.context.config.DelegatingApplicationListener org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListenercode

建立Environment以及對Environment進行相應的配置

Environment接口表明Spring應用的上下文環境,保存了Spring應用的配置文件和系統屬性

  • 示例化Environment 會根據是否在Web環境上示例化對應Environment實現類,若是是Web環境,就建立StandardServletEnvironment,不是則建立StandardEnvironment,StandardServletEnvironmentServletJNDI的屬性進行了設置
  • 將命令行參數配置進Environment當中,具體方法SpringApplication.configurePropertySources()

能夠利用SpringApplication.addCommandLineProperties 屬性對命令行參數進行禁用

  • 設置EnvironmentactiveProfiles,從spring.profiles.active屬性中讀取
  • 執行SpringApplicationRunListeners.environmentPrepared()方法 在該方法中利用了SpringApplicationRunListener實現類EventPublishingRunListenerApplicationListener實現類廣播了ApplicationEnvironmentPreparedEvent事件 >響應了ApplicationEnvironmentPreparedEvent事件的ApplicationListener >org.springframework.cloud.bootstrap.BootstrapApplicationListener >org.springframework.cloud.bootstrap.LoggingSystemShutdownListener >org.springframework.boot.context.config.ConfigFileApplicationListener >org.springframework.boot.context.config.AnsiOutputApplicationListener >org.springframework.boot.logging.LoggingApplicationListener >org.springframework.boot.autoconfigure.BackgroundPreinitializer >org.springframework.boot.logging.ClasspathLoggingApplicationListener >org.springframework.boot.context.config.DelegatingApplicationListener >org.springframework.boot.context.FileEncodingApplicationListener

建立ApplicationContext以及對ApplicationContext進行相應的配置

  • 實例化ApplicationContext 會根據是否在Web環境上示例化對應ApplicationContext實現類,若是是Web環境,就建立AnnotationConfigEmbeddedWebApplicationContext,不是則建立AnnotationConfigApplicationContext
  • 將建立好的Environment設置進ApplicationContext
  • ApplicationContext進行前置處理 若是指定了BeanNameGeneratorResourceLoader,會設置到ApplicationContext
  • 執行ApplicationContextInitializer

org.springframework.cloud.bootstrap.BootstrapApplicationListener$AncestorInitializer org.springframework.cloud.bootstrap.BootstrapApplicationListener$DelegatingEnvironmentDecryptApplicationInitializer org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration$$EnhancerBySpringCGLIB$$d551191c org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer org.springframework.boot.context.config.DelegatingApplicationContextInitializer org.springframework.boot.context.ContextIdApplicationContextInitializer org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer org.springframework.boot.context.embedded.ServerPortInfoApplicationContextInitializer

  • 執行SpringApplicationRunListeners.contextPrepared()方法
  • 註冊命令行參數bean,DefaultApplicationArguments
  • 加載sourcesApplicationContext
  • 執行SpringApplicationRunListeners.contextLoaded()方法 在這一步首先會將如今的ApplicationListener註冊到ApplicationContext當中,而後再利用了SpringApplicationRunListener實現類EventPublishingRunListenerApplicationListener實現類廣播了ApplicationPreparedEvent事件

添加到ApplicationContextApplicationListener org.springframework.cloud.bootstrap.BootstrapApplicationListener org.springframework.cloud.bootstrap.LoggingSystemShutdownListener org.springframework.boot.context.config.ConfigFileApplicationListener org.springframework.boot.context.config.AnsiOutputApplicationListener org.springframework.boot.logging.LoggingApplicationListener org.springframework.boot.autoconfigure.BackgroundPreinitializer org.springframework.boot.logging.ClasspathLoggingApplicationListener org.springframework.cloud.context.restart.RestartListener org.springframework.boot.context.config.DelegatingApplicationListener org.springframework.boot.builder.ParentContextCloserApplicationListener org.springframework.boot.ClearCachesApplicationListener org.springframework.boot.context.FileEncodingApplicationListener org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener 響應了ApplicationPreparedEvent事件的ApplicationListener org.springframework.boot.context.config.ConfigFileApplicationListener org.springframework.boot.logging.LoggingApplicationListener org.springframework.cloud.context.restart.RestartListener org.springframework.boot.context.config.DelegatingApplicationListener

  • refreshContext()
  • afterRefresh() 執行實現了ApplicationRunnerCommandLineRunner的bean
  • 執行SpringApplicationRunListeners.finished()方法
相關文章
相關標籤/搜索