-
1、实例化/初始化 springAppliction 构造函数处理了几个事
- 持有启动方法传递的class对象
- 是否是web类型,还是都不是
- 初始化spring.factories配置的 ApplicationContextInitializer对象①
- 初始化spring.factories配置的 ApplicationListener对象②
- 从调用栈里查找main方法的类对象.
-
2、运行
- 配置awt headless模式,声明没有图像设备等.
- 初始化spring.factories和输入参数指定的 SpringApplicationRunListener对象, 并启动监听.
- 触发所有的SpringApplicationRunListener的starting方法->发出ApplicationStartingEvent事件③
- 初始化环境environment
- 根据环境创建environment
- 触发所有的SpringApplicationRunListener的environmentPrepared方法->发出ApplicationEnvironmentPreparedEvent事件③
- 实例化/初始化ApplictionContext, 会判断是否是web环境, 创建对应的applictionContext
- 初始化spring.factories配置的 SpringBootExceptionReporter对象, 该对象会同时加载spring.factories配置的FailureAnalyzer类对象。SpringBootExceptionReporter用于程序启动时异常捕获,并输出成易于查看的格式.
- 准备ApplictionContext
- 触发所有ApplicationContextInitializer对象的initialize方法
- 触发SpringApplicationRunListener的监听,触发contextPrepared方法 ->发出ApplicationContextInitializedEvent事件③
- 根据启动方法的class对象加载资源
- 触发SpringApplicationRunListener的监听,触发contextLoaded方法->发出ApplicationPreparedEvent事件③
-
刷新ApplictionContext, 委托给spring最原始的refresh方法
- 触发SpringApplicationRunListener的监听,触发started方法->发出ApplicationStartedEvent事件③
-
触发ApplicationRunner, CommandLineRunner实现类的run方法
-
触发SpringApplicationRunListener的监听,触发running方法->发出ApplicationReadyEvent事件③
方法运行结束,程序退出
① 可以实现自己的ApplicationContextInitializer, 在springApplication前执行.
② 可以监听启动过程发生的事件, 如ConfigFileApplicationListener监听ApplicationEnvironmentPreparedEvent事件,处理EnvironmentPostProcessor,可以自定义自己的配置文件加载等.
③ 可以监听事件,在启动的不通阶段插入自定义的处理.
总结:
spring-boot的启动扩展的ApplicationContext,在ApplicationContext初始化/刷新前后做了自定义处理。也方便开发人员在流程中自定义插入自己的实现.
网友评论