执行Main方法执行了:

1、要完成Spring容器的启动
2、把项目部署到tomcat


org.springframework.boot.SpringApplication#run(java.lang.Class<?>, java.lang.String…)
调用了
org.springframework.boot.SpringApplication#run(java.lang.Class<?>[], java.lang.String[])
调用了
org.springframework.boot.SpringApplication#run(java.lang.String…)

其中run方法是启动SpringBoot的核心方法,


1————————————-


主要作用:

1.org.springframework.boot.SpringApplication#getRunListeners
在META-INF/spring.factories文件下的类,获取实现了SpringApplicationRunListener接口的实现类,通过SPI机制加载..
然后调用SpringApplicationRunListener的starting方法

2. 打印启动的banner图,


3.调用SpringApplication#createApplicationContext 创建默认的AnnotationConfigServletWebServerApplicationContext上下文(反射方式),并且在构造方法创建 AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner扫描器对象
在实例化AnnotatedBeanDefinitionReader的时候会调用
AnnotationConfigUtils#registerAnnotationConfigProcessors(BeanDefinitionRegistry)
会给关键的BeanPostProcessor加载出来(变成BeanDefinition对象了),比如说ConfigurationClassPostProcessor和AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor


调用SpringApplication#refreshContext启动Spring容器.该方法内部会调用AbstractApplicationContext#refresh方法来完成Spring容器的加载,其中小细节是调用到refresh方法里面的onRefresh方法,会调用子类ServletWebServerApplicationContext的onRefresh方法,在onRefresh方法内部调用到了.ServletWebServerApplicationContext#createWebServer 内部调用了
TomcatServletWebServerFactory#getWebServer 在这个方法创建了Tomcat容器,并且设置Tomcat的工作路径等等参数设置.然后就是启动Tomcat.


1————————————-
启动SpringBoot的启动类run方法之后会最终调用到()

public ConfigurableApplicationContext run(String… args) {
//秒表计时器,用来记录整个容器启动时间
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
FailureAnalyzers analyzers = null;
//配置headless系统属性
configureHeadlessProperty();
//获取springbootApplication注解的类信息开启监听
SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting();
try {
//应用参数初始化
ApplicationArguments applicationArguments = new DefaultApplicationArguments(
args);
//环境变量初始化
ConfigurableEnvironment environment = prepareEnvironment(listeners,
applicationArguments);
//打印banner,就是spring图形
Banner printedBanner = printBanner(environment);
//创建应用上下文,默认会得到AnnotationConfigEmbeddedWebApplicationContext
context = createApplicationContext();
//反射加载实例化FailureAnalyzer实现类
analyzers = new FailureAnalyzers(context);
//上下文环境准备
prepareContext(context, environment, listeners, applicationArguments,
printedBanner);
//主要的IOC过程,也是springMVC的主要过程,进行bean的相关接口初始化和bean实例化
refreshContext(context);
//到上一步tomcat已经启动完成了,这里算是springboot的扩展接口,可以自己实现ApplicationRunner或CommandLineRunner接口,在这里进行实例化开始运行
afterRefresh(context, applicationArguments);
//发布事件监听器
listeners.finished(context, null);
//停止计时
stopWatch.stop();
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass)
.logStarted(getApplicationLog(), stopWatch);
}
return context;
}
catch (Throwable ex) {
handleRunFailure(context, listeners, analyzers, ex);
throw new IllegalStateException(ex);
}
}


其实这个方法我们可以简单的总结下步骤为 > 1. 配置属性 > 2. 获取监听器,发布应用开始启动事件 > 3. 初始化输入参数 > 4. 配置环境,输出banner > 5. 创建上下文(默认AnnotationConfigEmbeddedWebApplicationContext) > 6. 预处理上下文 > 7. 刷新上下文 > 8. 再刷新上下文 > 9. 发布应用已经启动事件 > 10. 发布应用启动完成事件.

AnnotationConfigServletWebServerApplicationContext

默认上下文,在创建的时候,在构造方法创建 org.springframework.context.annotation.AnnotatedBeanDefinitionReader和org.springframework.context.annotation.ClassPathBeanDefinitionScanner扫描器对象