执行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扫描器对象