level 4
突然很无聊😞
楼主
查看SpringApplication实例对象初始化创建的源码信息,核心代码具体如下
```java
publicSpringApplication(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应用(Spring5开始出现的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()方法启动的主程序启动类
2020年06月18日 07点06分
1
```java
publicSpringApplication(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应用(Spring5开始出现的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()方法启动的主程序启动类