SpringApplication实例的初始化创建**

查看SpringApplication实例对象初始化创建的源码信息,核心代码具体如下 

 

```java

public SpringApplication(ResourceLoaderresourceLoader, Class... primarySources) {

       this.sources = new LinkedHashSet();

       this.bannerMode = Mode.CONSOLE;

       this.logStartupInfo = true;

       this.addCommandLineProperties = true;

       this.addConversionService = true;

       this.headless = true;

       this.registerShutdownHook = true;

       this.additionalProfiles = new HashSet();

       this.isCustomEnvironment = false;

       this.resourceLoader = resourceLoader;

       Assert.notNull(primarySources, "PrimarySources must not be null");

  //把项目启动类.class设置为属性存储起来

       this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));

 

  //判断当前webApplicationType应用的类型

       this.webApplicationType = WebApplicationType.deduceFromClasspath();

 

  // 设置初始化器(Initializer),最后会调用这些初始化器

       this.setInitializers(this.getSpringFactoriesInstances(

ApplicationContextInitializer.class));

  // 设置监听器(Listener)

       this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));

  // 用于推断并设置项目main()方法启动的主程序启动类

       this.mainApplicationClass = this.deduceMainApplicationClass();

 

```

 

从上述源码可以看出,SpringApplication的初始化过程主要包括4部分,具体说明如下。

 

(1)this.webApplicationType = WebApplicationType.deduceFromClasspath()

 

 用于判断当前webApplicationType应用的类型。deduceFromClasspath()方法用于查看Classpath类路径下是否存在某个特征类,从而判断当前webApplicationType类型是SERVLET应用(Spring 5之前的传统MVC应用)还是REACTIVE应用(Spring 5开始出现的WebFlux交互式应用) 

 

(2)this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class))

 

用于SpringApplication应用的初始化器设置。在初始化器设置过程中,会使用Spring类加载器SpringFactoriesLoader从META-INF/spring.factories类路径下的META-INF下的spring.factores文件中获取所有可用的应用初始化器类ApplicationContextInitializer。

 

(3)this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class))

 

用于SpringApplication应用的监听器设置。监听器设置的过程与上一步初始化器设置的过程基本一样,也是使用SpringFactoriesLoader从META-INF/spring.factories类路径下的META-INF下的spring.factores文件中获取所有可用的监听器类ApplicationListener。

 

(4)this.mainApplicationClass = this.deduceMainApplicationClass()

 

用于推断并设置项目main()方法启动的主程序启动类

       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

这些内容,是从拉勾教育的《Java工程师高薪训练营》里学到的,课程内容非常全面,还有拉勾的内推大厂服务,推荐你也看看。

posted @ 2020-06-18 15:50  西西宝贝  阅读(289)  评论(0)    收藏  举报