Spring Boot 初始化及加载
1. 设置开关
bannerMode (横幅模式,默认为CONSOLE)
logStartupInfo (日志开关,默认为true)
addCommandLineProperties (添加命令行属性开关,默认为true)
headless (程序运行模式,java.jwt.headless=true)
registerShutdownHook (注册销毁回调,默认为true)
2.初始化profile容器
存储当前激活的profile
3.初始化
3.1 推断运行环境
首先判定classpath下是否包含javax.servlet.Servlet类或org.springframework.web.context.ConfigurableWebApplicationContext类,若包含二者其中一个,则推断当前程序为web程序
3.2 初始化初始工厂类
加载在classpath:META-INF/spring.factories文件中属性key为org.springframework.context.ApplicationContextInitializer的值——工厂类的全限定名
3.3 初始化容器监听
加载在classpath:META-INF/spring.factories文件中属性key为org.springframework.context.ApplicationListener的值——容器监听的全限定名
3.4 推断程序入口主类
根据栈帧推断程序入口类
4.加载
4.1 注册StopWatch并打开
4.2 初始化环境配置容器
4.3 初始化失败分析器
4.4 响应程序运行模式(前面提到的 java.awt.headless,这里不扩展此点,自行查阅资料)
4.5 加载spring boot监听
加载在classpath:META-INF/spring.factories文件中属性key为org.springframework.boot.SpringApplicationRunListener的值——spring boot监听的全限定名
4.6 加载应用参数
根据程序入口main(String[] args)中的参数配置对应的应用参数,等到应用参数对象。
4.7 根据应用参数及spring boot监听配置环境并提供环境配置对象
获取或创建环境容器
加载配置文件并根据spring.profiles.active加载profile
加载配置文件并触发环境前监听
4.8 打印横幅
4.9 创建ApplicationContext
4.10 创建失败分析器
加载在classpath:META-INF/spring.factories文件中属性key为org.springframework.boot.diagnostics.FailureAnalyzer的值——失败分析器的全限定名,
并且注入BeanFactory。
注意,此失败分析器与4.3提到的并不是一个失败分析器,当前创建失败分析器为配置spring.factories中的失败分析器。
4.11 前置配置ApplicationContext
注入前面构建好的环境对象到ApplicationContext
根据BeanNamedGenerator和ResourceLoader后置处理ApplicationContext
应用所有初始化器
响应应用上下文前置监听
初始化日志对象
把应用参数对象加入到容器中
加载所有资源到ApplicationContext
响应应用加载时监听
4.12 刷新ApplicationContext
刷新BeanFactory
自定义后置处理Bean工厂,若未继承SpringApplication并且未实现该方法,未此步骤忽略
调用Bean工厂后置处理器
注册Bean后置处理器
初始化国际化
初始化应用事件
自定义刷新,若未继承SpringApplication并且未实现该方法,未此步骤忽略
注册所有监听到容器
结束BeanFactory初始化
结束IOC容器初始化
注册销毁回调
4.13 刷新后处理
回调所有Runner