在上一篇文章【构造SpringApplication实例对象】中我们分析了SpringApplication的构造方法,但是SpringApplication.run()需要返回ConfigurableApplicationContext对象实例,所以下面来一起看下run()中的逻辑。
run方法的代码有点长我们将抛弃掉一些比较次要的内容:
public ConfigurableApplicationContext run(String... args) {
// 声明一个Context容器
ConfigurableApplicationContext context = null;
// 获取监听器
SpringApplicationRunListeners listeners = getRunListeners(args);
// 调用监听器的启动
listeners.starting();
try {
// 创建并配置Environment(这个过程会加载application配置文件)
ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
// 根据应用类型创建对应的Context容器
context = createApplicationContext();
// 刷新Context容器之前的准备
prepareContext(context, environment, listeners, applicationArguments, printedBanner);
// 刷新Context容器
refreshContext(context);
// 刷新Context容器之后处理
afterRefresh(context, applicationArguments);
// Context容器refresh完毕发布
listeners.started(context);
// 触发Context容器refresh完以后的执行
callRunners(context, applicationArguments);
} catch (Throwable ex) {}
try {
// Context启动完毕,Runner运行完毕发布
listeners.running(context);
} catch (Throwable ex) {}
return context;
}
简化后的代码看起来就比较清晰了,我们再整理一下逻辑
1)首先会从spring.factories配置文件中获取SpringApplicationRunListener监听器并启动监听器;
2)而后就会去创建Environment
3)紧接着创建ApplicationContext
4)ApplicationContext的refresh的事前准备
5)ApplicationContext的refresh
6)ApplicationContext的refresh之后
7)发布ApplicationContext的refresh完毕的事件
8)触发runner
9)最后发布refresh完毕、runner执行完毕的事件
run方法描述了SpringApplication这个类的职责,包含了不少步骤,但简单的看其实就是为了创建并配置好一个ApplicationContext。
下面就会根据这几个步骤分别来介绍run()方法中如何创建ConfigurableApplicationContext对象的。
1.获取并启动监听器
源代码如下:
//获取SpringApplicationRunListeners接口的实现类
SpringApplicationRunListeners listeners = getRunListeners(args);
//启动监听
listeners.starting();
获取SpringApplicationRunListeners接口实现类和上一篇文章讲的一样就是从spring.factories文件中查找接口的实现类并通过反射构造实例,这里就不深入跟踪了。
下面的部分拆开来描述.