说在前面
本次开始spring-boot源码解析
源码解析
创建SpringApplication对象进入到这个方法org.springframework.boot.SpringApplication#SpringApplication(java.lang.Object...)
public SpringApplication(Object... sources) {
initialize(sources);}
进入到这个方法org.springframework.boot.SpringApplication#initialize
private void initialize(Object[] sources) {
if (sources != null && sources.length > 0) {
this.sources.addAll(Arrays.asList(sources)); }this.webEnvironment = deduceWebEnvironment();// 加载初始化器 setInitializers((Collection) getSpringFactoriesInstances(
ApplicationContextInitializer.class));// 加载监听器 setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); this.mainApplicationClass = deduceMainApplicationClass(); }
进入到这个方法org.springframework.boot.SpringApplication#getSpringFactoriesInstances(java.lang.Class)从META-INF/spring.factories路径加载ApplicationContextInitializer
进入到这个方法org.springframework.boot.SpringApplication#getSpringFactoriesInstances(java.lang.Class)从META-INF/spring.factories路径加载
ApplicationListener
进入到这个方法org.springframework.boot.SpringApplication#deduceMainApplicationClass
根据main方法找到应用启动类
private Class> deduceMainApplicationClass() {
try {
StackTraceElement[] stackTrace = new RuntimeException().getStackTrace(); for (StackTraceElement stackTraceElement : stackTrace) {
if ("main".equals(stackTraceElement.getMethodName())) {
return Class.forName(stackTraceElement.getClassName()); }
}
}catch (ClassNotFoundException ex) {
// Swallow and continue }return null;}
进入到这个方法org.springframework.boot.SpringApplication#run(java.lang.String...)
// spring-boot源码解析 应用启动 public ConfigurableApplicationContext run(String... args) {
StopWatch stopWatch = new StopWatch(); stopWatch.start(); ConfigurableApplicationContext context = null; FailureAnalyzers analyzers = null; configureHeadlessProperty();// 初始化SpringApplicationRunListener -》 SpringApplicationRunListeners listeners = getRunListeners(args); listeners.starting(); try {
ApplicationArguments applicationArguments = new DefaultApplicationArguments(
args); ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);// 打印banner Banner printedBanner = printBanner(environment);// 初始化spring上下文 -》 context = createApplicationContext(); analyzers = new FailureAnalyzers(context);// 准备spring上下文 -》 prepareContext(context, environment, listeners, applicationArguments, printedBanner);// 刷新spring上下文 -》 refreshContext(context);// spring上下文初始化完毕加载其他applicationRunner afterRefresh(context, applicationArguments);// 执行监听器spring加载完成事件 listeners.finished(context, null); stopWatch.stop(); if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass)
.logStarted(getApplicationLog(), stopWatch); }return context; }catch (Throwable e