Code of Spring and Spring Boot 16 Apr 2018
基于Spring Boot 2.0.x和Spring 5.0.x
Spring Boot启动流程
- 检测Spring应用类型(Reactive-Web, Non-Web以及Web-Servlet)
- 通过spring.factories文件加载并实例化注册的
org.springframework.context.ApplicationContextInitializers - 通过spring.factories文件加载并实例化注册的
org.springframework.context.ApplicationListeners - 确定Spring Boot工程的Main Class
- 通过spring.factories文件加载并实例化注册的
org.springframework.boot.SpringApplicationRunListener, 并分发ApplicationStartingEvent事件给ApplicationListeners - 根据应用类型创建
org.springframework.core.env.ConfigurableEnvironment实例, 分发ApplicationEnvironmentPreparedEvent事件给ApplicationListeners - 创建
org.springframework.context.ConfigurableApplicationContext实例 - Apply
ApplicationContextInitializers SpringApplicationRunListeners#contextPrepared(空方法)- load(annotated main class)
- 分发
ApplicationPreparedEvent事件给ApplicationListeners - context.refresh
- 由ApplicationContext分发
ApplicationStartedEvent事件 - 由ApplicationContext分发分发
ApplicationReadyEvent事件 - 如果应用在启动过程中有错误发生, 则分发
ApplicationFailedEvent事件给ApplicationListeners
Spring Boot预置的spring.factories
Spring Boot通过org.springframework.core.io.support.SpringFactoriesLoader#loadFactories(Class clazz, ClassLoader loader)来获取某个类别下的实例
ApplicationContextInitializer
- spring-boot
org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializerorg.springframework.boot.context.ContextIdApplicationContextInitializerorg.springframework.boot.context.config.DelegatingApplicationContextInitializerorg.springframework.boot.web.context.ServerPortInfoApplicationContextInitializer
-
- -
- spring-boot-autoconfigure
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializerorg.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
-
- -
- 如果引入了spring-boot-devtools, 还包括以下
ApplicationContextInitializerorg.springframework.boot.devtools.restart.RestartScopeInitializer
ApplicationListener
- spring-boot
org.springframework.boot.ClearCachesApplicationListenerorg.springframework.boot.builder.ParentContextCloserApplicationListenerorg.springframework.boot.context.FileEncodingApplicationListenerorg.springframework.boot.context.config.AnsiOutputApplicationListenerorg.springframework.boot.context.config.ConfigFileApplicationListenerorg.springframework.boot.context.config.DelegatingApplicationListenerorg.springframework.boot.context.logging.ClasspathLoggingApplicationListenerorg.springframework.boot.context.logging.LoggingApplicationListenerorg.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener
-
- -
- spring-boot-autoconfigure
org.springframework.boot.autoconfigure.BackgroundPreinitializer
-
- -
- 如果引入了spring-boot-devtools, 还包括以下
ApplicationListenerorg.springframework.boot.devtools.restart.RestartApplicationListener
SpringApplicationRunListener
org.springframework.boot.context.event.EventPublishingRunListener
Spring Boot启动过程中部分重要的事件以及处理过程
ApplicationStartingEvent
LoggingApplicationListener: 构建日志系统BackgroundPreinitializer: 后台启动一个线程, 用来预先初始化一些服务RestartApplicationListener: 初始化Restarter
ApplicationEnvironmentPreparedEvent
ConfigFileApplicationListener: 载入注册于spring.factories的org.springframework.boot.env.EnvironmentPostProcessors, 主要用于在context.refresh之前自定义应用的Environment, 并且载入注册的org.springframework.boot.env.PropertySourceLoader定义的属性配置, 例如application.ymlDelegatingApplicationListener: 在本阶段(EnvironmentPrepared)载入注册于context.listener.classes属性下的ApplicationListeners, 并将后续事件分发给他们LoggingApplicationListener: 初始化日志系统, 并注册Shutdown HookConfigFileApplicationListener: 将默认属性优先级将为最低
ApplicationPreparedEvent(contextLoaded)
LoggingApplicationListener: 将日志系统注册到BeanFactory
ApplicationStartedEvent(contextRefreshed)
ApplicationReadyEvent(main class run)
BackgroundPreinitializer: 如果预载服务的线程任务没有结束, 阻塞主线程
ApplicationContextInitializer初始化过程
ConfigurationWarningsApplicationContextInitializer: 对有问题的BeanDefinitionRegistry进行提示ContextIdApplicationContextInitializer: 创建一个ContextId, 并将其注册到BeanFactoryDelegatingApplicationContextInitializer: 初始化其他注册在context.initializer.classes的ApplicationContextInitializerServerPortInfoApplicationContextInitializer: 将自身作为一个ApplicationListener注册到ApplicationContext, 用于监听WebServerInitializedEvent事件SharedMetadataReaderFactoryContextInitializer: 创建一个ConfigurationClassPostProcessor(用于处理标注@Configuration的类)和Spring Boot共享的一个MetadataReader, 用于读取类的元信息-
- -
ConditionEvaluationReportLoggingListener: 注册一个ApplicationListener用于在contextRefreshed的时候打印Auto Configuration的信息RestartScopeInitializer: 注册一个RestartScope到BeanFactory