欢迎来到DIVCSS5查找CSS资料与学习DIV CSS布局技术!
一、Springboot启动流程
 
所有的SpringBoot工程,都有自己的启动类,这个启动类身上有一个固定注解@SpringBootApplication,并携带一个main(),通过这个方法即可完成启动。
 
启动流程,可以分为2个步骤:
 
1、初始化SpringApplication对象阶段 (加载相关资源,判断是否是个WEB工程,创建一个构造器(完成自动化配置),创建一个ContextLoadLister,加载主启动类所需要所有组件)
 
2、run启动应用阶段
 
​ 开启各种容器:tomcat容器,springIOC容器(DispatchServlet,ContextLoaderListener),向各种容器加载组件,并配置容器之间上下文环境
 
1. 第一步对SpringApplication的初始化
 
Springboot启动类入口程序,SpringApplication.run方法,先看run方法,再看@SpringBootApplication注解实现的自动配置功能。
 
run方法点击后,进入源码,如下图所示,会发现最终第二步源码中,实例化了SpringApplication,同时也运行了run方法。
 
先看SpringApplication的构造方法:它干了什么事情!
 
代码如下:
 
public SpringApplication(ResourceLoader resourceLoader, Class<?>… primarySources) {
 
    // resourceLoader 属性注入了 null
 
   this.resourceLoader = resourceLoader;
 
   Assert.notNull(primarySources, "PrimarySources must not be null");
 
  // 将启动类从数组重新封装成了 Set,注入到 primarySources 属性
 
   this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
 
    // 得到 web应用的类型,这里是 SERVLET 
 
    /*
 
    webApplicationType 有三种类型,REACTIVE、SERVLET、NONE
 
引入 spring-boot-starter-web 包,就是 SERVLET
 
引入 spring-boot-starter-webflux 包,是 REACTIVE
 
都没有就是 NONE
 
    */
 
   this.webApplicationType = WebApplicationType.deduceFromClasspath();
 
    //从 META-INF/spring.factories 
 
    //文件中得到 key 为 org.springframework.boot.BootstrapRegistryInitializer 的全类名集合,进行实例化,然后注入 bootstrapRegistryInitializers 属性
 
    //其中核心方法getSpringFactoriesInstances,等会详细讲解
 
   this.bootstrapRegistryInitializers = new ArrayList<>(
 
         getSpringFactoriesInstances(BootstrapRegistryInitializer.class));
 
//这一行代码,只是封装了一下,仍然还是调用 getSpringFactoriesInstances 方法,
 
//从 META-INF/spring.factories 文件中得到 key 为org.springframework.context.ApplicationContextInitializer 的全类名集合,
 
//进行实例化,然后注入 initializers(初始化器集合) 属性。            
 
    setInitializers((Collection)   getSpringFactoriesInstances(ApplicationContextInitializer.class));
 
    // 同理,得到监听器实例的集合,并注入  简单解释getSpringFactoriesInstances就是去spring.factories中读取配置文件
 
   setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
 
    // 获取当前运行的 main 方法所在的类,也就是咱们的主类
 
   this.mainApplicationClass = deduceMainApplicationClass();
 
}

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h64913.shtml