SpringBoot启动过程
SpringApplication的run方法
使用SpringFactoriesLoader读取listener和ApplicationContextInitializer
创建环境变量,读取配置信息
创建上下文(IoC容器,ApplicationContext)
预初始化上下文(prepareContext):将Application类读取成BeanDefinition
刷新上下文:
a. 加载所有的自动配置类,把bean解析成beanDefinition(invokeBeanFactoryPostProcessors)(SpringBoot的自动配置就是在这一步)
b. onRefresh里面createWebServer(tomcat)
c. 实例化bean(finishBeanFactoryInitialization)(完成bean的生命周期)
整个过程中会有很多事件的发布,调用监听器对外进行扩展
下图是调用static的run方法以后,实例化SpringApplication,并通过SpringFactoriesLoader读取一些initializer,listener
实例化以后就执行run方法
展开看refreshContext方法,主要做了三件事
1. bean生命周期前的一些工作:加载除Application类和一些processor的bean外的所有bean,将他们生成BeanDefinition加入到DefaultListableBeanFactory的beanDefinitionMap中 ,将bean以ObjectBean的形式加入到三级缓存
2. 启动tomcat
3. 执行bean的生命周期(实例化,属性设置,aware接口,初始化前方法,初始化,初始化后方法,放入IoC容器)
如果想在SpringBoot启动完成的时候立刻做一些事情(比如初始化一些数据等),可以实现ApplicationRunner接口,并加个Component注解