开发者学堂课程【SpringBoot快速掌握 - 核心技术:第二步:启动应用】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/612/detail/9281
第二步:启动应用
内容简介:
一、运行 run 方法
二、代码模块
一、运行 run 方法
1.几个重要的事件回调机制
配置在 META-INF/spring.factories
ApplicationContextlnitializer
SpringApplicationRunListener
只需要放在 ioc 容器中
ApplicationRunner
CommandLineRunner
2.run方法流程
首先创建 stopWatch 进行监听,接下来声明 analyzers 值为空,input 进 configureHead 可查看与做 awt 有关,configureHeadlessProperty 获取SpringApplicationRunListeners 从类路径下 META-INF/spring.factories
,而且有些监听器是需要配置的,获取后 listeners.starting 开始回调所有的获取Sp
ringApplicationRunListener.star()
方法,后面 args 命令行参数相当于使用 ApplicationArguments 封装了。再 Configurable 环境准备,进行获取或者创建环境,创建环境完成后进行回调Sp
ringApplicationRunListener
.
environmentPrepared()
;表示环境准备完成。然后是打印 banner 图标,创建 applicationcontext,根据判断得到容器类型,因为此处是 web 环境,所以 context 会得到 AnnotationConfigEmbeddedWebAppAnnotationContext,之后用 BeanUtils 工具利用反式 instantiate 创建 ioc 容器,主要决定创建 web.ioc 还是普通 ioc 容器。 Fai
lureAnalyzers
是出现异常时做异常分析报告,
Fai
lureAnalyzers
(
context)
是准备上下文环境,帮助传入了 ioc 容器,运行的环境,包括 listeners 监听器等, context 做保存创建的环境和 ioc 的后置处理注册小组件的准备工作,而且 applyInitialize 调用initialize方法获取所有的创建 SpringApplication 对象时的 initializer,所以是回调之前保存的所有的 ApplicationContextInitializer 的 initialize 方法。prepareContext 运行完成以后回调所有的SpringApplicationRunListener
的 contextLoaded()
;刷新后容器初始化,进行 ApplicationRunner 和 CommandLineRunner 回调,选择进行干预程度只需要调整相应的监听回调器即可。
二、代码模块
public ConfigurableApplicationContext run(String... args){
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
FailureAnalyzers analyzers = null;
configureHeadlessProperty();
//获取SpringApplicationRunListeners;从类路径下META-INF/spring.factories
SpringApplicationRunListeners listeners = getRunListeners(args);
//回调所有的获取
SpringApplicationRunListener.starting()
方法
listeners.starting();
try {
//封装命令行参数
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
//准备环境
ConfigurableEnvironment environment=prepareEnvironment(listeners,applicationArguments);
//创建环境完成后回调SpringApplicationRunListener.environmentPrepared();表示环境准备完成
Banner printedBanner = printBanner(environment);
//创建
ApplicationContext;决定创建
web 的
ioc 还是普通的
ioc
context = createApplicationcontext();
analyzers = new FailureAnalyzers(context);
//准备上下文环境;将
environment 保存到
ioc 中;而且applyInitializers();
//applyInitializers():回调之前保存的所有的ApplicationContextInitializer的initialize方法
//回调所有的
SpringApplicationRunListener 的contextPrepared();
prepareContext(context, environment, listeners, applicationArguments,printedBanner);
//prepareContext
运行完成以后回调所有的SpringApplicationRunListener的contextLoaded();
//s
刷新容器;
ioc容器初始化(如果是web应用还会创建嵌入式的Tomcat);Spring注解版
refreshContext(context);
/
/
扫描,创建,加载所有组件的地方;(配置类,组件,自动配置
)
refreshcontext(
context);
//从
ioc
容器中获取所有的
ApplicationRunner 和CommandLineRunner
进行回调
//ApplicationRunner
先回调,CommandLineRunner 再回调afterRefresh(context, applicationArgument
s
)
//所有的
SpringApplicationRunListener 回调
finished 方法
listeners.finished(context, null);
stopWatch.stop();
if (this.logstartupInfo){
new StartupInfoLogger(this.mainApplicationclass)
.logstarted(getApplicationLog(), stopWatch);
//整个
SpringBoot 应用启动完成以后返回启动的
ioc 容器;
return context;
catch (Throwable ex){
handleRunFailure(context, listeners, analyzers, ex);
throw new IllegalstateException(ex);