个人觉得这个也很重要的,顺便在这里参考“芋艿“的博客深入学习下底层源码,然后再配合一张图来帮助理解记忆。咱们的Spring Boot版本是1.5.9,所以您的版本里源码实现可能会有区别,但我觉得不同版本的Spring Boot整体思想应该差不多。
构造器
// sources数组仅仅包含一个元素: DemoApplication.class
public SpringApplication(Object... sources) {
initialize(sources);
}
private void initialize(Object[] sources) {
if (sources != null && sources.length > 0) {
this.sources.addAll(Arrays.asList(sources));
}
// 判断是否是web环境,不同的spring boot版本,实现可能不一样
this.webEnvironment = deduceWebEnvironment();
// 设置ApplicationContextInitializer
setInitializers((Collection) getSpringFactoriesInstances(
ApplicationContextInitializer.class));
// ApplicationListener List
setListeners((Collection)
getSpringFactoriesInstances(ApplicationListener.class));
this.mainApplicationClass = deduceMainApplicationClass();
}
public void setInitializers(
Collection<? extends ApplicationContextInitializer<?>> initializers) {
this.initializers = new ArrayList<ApplicationContextInitializer<?>>();
this.initializers.addAll(initializers);
}
public void setListeners(Collection<? extends ApplicationListener<?>> listeners) {
this.listeners = new ArrayList<ApplicationListener<?>>();
this.listeners.addAll(listeners);
}
// 下面是SpringApplication 类的一些属性
private ConfigurableEnvironment environment;
private Class<? extends ConfigurableApplicationContext> applicationContextClass;
private boolean webEnvironment;
private List<ApplicationContextInitializer<?>> initializers;
private List<ApplicationListener<?>> listeners;
复制代码
![](liutianruo-2019-go-go-go.oss-cn-shanghai.aliyuncs.com/notes/02_Sp… Application构造器.png)
run()
这就是启动Spring Boot最核心的代码了,正菜来了哦。
public ConfigurableApplicationContext run(String... args) {
// 用来配合日志统计启动时间的
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
FailureAnalyzers analyzers = null;
// awt相关,可忽略
configureHeadlessProperty();
// 获得 SpringApplicationRunListeners(封装了多个SpringApplicationRunListener)
SpringApplicationRunListeners listeners = getRunListeners(args);
// 启动监听
listeners.starting();
try {
//创建 ApplicationArguments 对象
ApplicationArguments applicationArguments = new DefaultApplicationArguments(
args);
// 加载属性配置。执行完成后,所有的 environment 的属性都会加载进来,包括 application.properties 和外部的属性配置
ConfigurableEnvironment environment = prepareEnvironment(listeners,
applicationArguments);
// 不重要,就控制台显示 Spring Boot 图案的,吉祥物属于是
Banner printedBanner = printBanner(environment);
// Spring上下文
context = createApplicationContext();
// 异常报告器
analyzers = new FailureAnalyzers(context);
// 调用所有初始化类的 initialize
prepareContext(context, environment, listeners, applicationArguments,
printedBanner);
// 初始化spring上下文
refreshContext(context);
//执行 Spring 上下文的初始化的后置逻辑
afterRefresh(context, applicationArguments);
// 通知监听器,spring上下文启动完成
listeners.finished(context, null);
// 统计时长结束
stopWatch.stop();
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass)
.logStarted(getApplicationLog(), stopWatch);
}
return context;
}
catch (T