SpringBoot启动概述(SpringBoot2.1.7)
- 实例化
SpringApplication
- 推断web应用的类型(
webApplicationType
) - 初始化
ApplicationContextInitializer
:通过ClassLoader.getResources
加载META-INF/spring.factories
路径下的文件信息,从中找key为ApplicationContextInitializer.class
的对应类,并实例化 - 读取
META-INF/spring.factories
,并实例化ApplicationListener
:通过ClassLoader.getResources
加载META-INF/spring.factories
路径下的文件信息ApplicationListener.class
对应类,并实例化 - 推断main方法所在类
- 推断web应用的类型(
- 调用
SpringApplication.run()
方法- 调用
getRunListeners()
方法从META-INF/spring.factories
配置文件中读取所有配置的SpringApplicationRunListener
,并构造SpringApplicationRunListeners
实例 - 调用所有
SpringApplicationRunListeners
的starting()
方法,发布ApplicationStartedEvent
事件 - 调用
prepareEnvironment()
方法准备环境信息()prepareEnvironment()
内调用getOrCreateEnvironment()
方法得到环境对象ConfigurableEnvironment,没有则创建一个StandardServletEnvironment- 调用
configureEnvironment()
方法配置激活环境信息,通过从系统环境变量里取或启动时通过SpringApplication.setAdditionalProfiles("")
添加进来的 - 调用所有
SpringApplicationRunListeners
的environmentPrepared()
方法,发布ApplicationEnvironmentPreparedEvent
事件,加载Spring配置文件信息,例如application.properties等
- 打印Banner(SpringBoot)
- 调用
createApplicationContext()
方法根据webApplicationType
创建ApplicationContext
对象- 由于是
SERVLET
所以创建的是AnnotationConfigServletWebServerApplicationContext()
对象 AnnotationConfigServletWebServerApplicationContext()
对象会创建AnnotatedBeanDefinitionReader
对象检测是否需要将以下对象放到Spring上下文中:// 用户配置Configuration注解,实现了BeanDefinitionRegistryPostProcessor接口, // 在容器刷新时,处理后置工厂处理器用来扫描Spring,注册Bean ConfigurationClassPostProcessor // 用于配置Autowired注解,实现了MergedBeanDefinitionPostProcessor接口 AutowiredAnnotationBeanPostProcessor // 用于配置Required注解,实现了MergedBeanDefinitionPostProcessor接口 RequiredAnnotationBeanPostProcessor // 用于配置JSR-250注解,实现了InstantiationAwareBeanPostProcessor接口 CommonAnnotationBeanPostProcessor // 用于配置JPA注解 PersistenceAnnotationBeanPostProcessor // 用于配置EventListener注解,实现了SmartInitializingSingleton接口 EventListenerMethodProcessor // EventListener工厂 DefaultEventListenerFactory
- 由于是
- 调用
prepareContext()
方法准备应用上下文context.setEnvironment(environment)
对ApplicationContext设置环境变量postProcessApplicationContext(context)
配置属性ResourceLoader和ClassLoader属性applyInitializers(context)
调用步骤1.2
查询出来ApplicationContextInitializer
子类,循环调用initialize()
方法。- 然后调用所有
SpringApplicationRunListeners
的contextPrepared()
方法,发布ApplicationContextInitializedEvent
事件
- 调用
refreshContext()
方法,刷新上下文- 底层调用
AbstractApplicationContext
的refresh()
方法刷新上下文- 调用
prepareRefresh()
方法准备刷新的上下文 - 调用
obtainFreshBeanFactory()
方法初始化BeanFactory prepareBeanFactory(beanFactory)
对beanFactory进行各种功能填充- 调用
postProcessBeanFactory(beanFactory)
方法添加后置处理器,创建Tomcat时会利用这个后置处理器来初始化Tomcat Server类 - 调用
invokeBeanFactoryPostProcessors(beanFactory)
,激活各种Beanfactory处理器:主要是利用AnnotatedBeanDefinitionReader
对象注入的ConfigurationClassPostProcessor
来处理组件的注入 registerBeanPostProcessors(beanFactory)
注册拦截Bean创建的Bean处理,这里只是注册,真正调用是再拿去Bean的时候initMessageSource()
为上下文初始化Message源,即不同语言的消息体,国际化处理,如果容器中没有则创建一个DelegatingMessageSource
国际化,并将它注册到Spring容器中initApplicationEventMulticaster()
初始化应用消息广播器,并放到applicationEventMulticaster
bean中,如果容器中没有则创建一个SimpleApplicationEventMulticaster
事件派发器,并将它注册到Spring容器中onRefresh()
留给子类来初始化其他bean,主要目的是初始化Tomcat等内置服务器(ServletWebServerApplicationContext
实现了AbstractApplicationContext
的onRefresh()
,方法底层调用了此类的createWebServer()
方法来创建WebServer容器)registerListeners()
在所有注册的bean中查找Listener bean,注册到消息广播中finishBeanFactoryInitialization(beanFactory)
初始化剩下的单实例(非惰性)finishRefresh()
完成刷新过程,通知生命周期处理器lifecycleProcessor刷新过程,同时发出ContextRefreshEvent
通知别人
- 调用
- 底层调用
- 调用
afterRefresh()
方法 - 调用所有
SpringApplicationRunListeners
的started()
方法 - 调用
callRunners()
方法(该方法会从IOC容器里找到ApplicationRunner或者CommandLineRunner并执行其run方法,当我们需要在SpringBoot程序启动时处理我们自己的逻辑,那么就可以实现上述接口) - 调用所有
SpringApplicationRunListeners
的running()
方法
- 调用
除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接