1.spring启动过程
1)定时器,监控启动时间
2)获取spring监听器,启动监听器
此处启动的监听器主要是做环境处理的监听器,与后面环境准备中和环境运行中的监听器不同。主要过程是相同的,都是通过发布事件找到事件对应的监听器,之后启动事件监听处理(有一点尚不确定,在发布事件时,spring默认的监听器都是直接调用执行的,定义了一个Executor线程池,但是没设置值,看到里面有设置的方法,应该是需要自定义设置去异步执行监听的监听器)。
3)对启动传入的参数args进行封装,判断环境是哪种模式SERVLET、REACTIVE还是默认模式,然后将其和监听器listeners一起绑定到环境中
4)配置需要忽略的Bean,配置启动时的Banner
5)创建容器
6)实例化SpringBootExceptionResporter,用于打印启动时的日志
7)准备容器
主要做容器环境的准备工作,如是否允许BeanDefine覆盖,是否是懒加载
8)刷新容器
a.prepareRefresh主要完成配置类的解析,验证启动必须参数等
b.prepareBeanFactory准备容器需要用的BeanFactory
c.invokeBeanFactoryPostProcessors实例化BeanFactoryPostProcessor
d.registerBeanPostProcessors实例化所有的BeanPostProcessor
e.initMessageSource国际化,如果无默认的,则使用父类的
f.onRefresh特殊的Bean和子类的初始化,模板方法,不同的容器做不同的处理,如tomcat,jetty等
g.registerListeners注册事件监听器
h.finishBeanFactoryInitialization实例化所有非懒加载的bean,这里包含所有bean的创建过程
j.finishRefresh发布相应的事件
9)刷新容器后的处理
10)定时器停止监听
11)判断是会否要输出启动日志
12)启动监听器开始监听启动事件
13)运行监听器开始监听容器运行事件
public ConfigurableApplicationContext run(String... args) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
configureHeadless