MacOS 11.6.1
IntelliJ IDEA 2020.1.2
SpringBoot 2.3.10.RELEASE
项目名:spring-study (启动类:SpringStudyApplication)
创建好SpringBoot项目之后,查看启动类SpringStudyApplication
可以看到,调用了SpringApplication
的一个static
方法: run(Class<?>, String...)
(图1);进去看其实就是new
了一个SpringApplication
对象然后调用对象的run
方法(图2)。
构造方法
SpringApplication
的构造方法,最终调用的是SpringApplication(ResourceLoader, Class<?>...)
,从此构造方法中看,SpringApplication
初始化了6个属性,从上到下分别是:
- resourceLoader: ResourceLoader
- primarySources: LinkedHashSet<Class<?>>
- webApplicationType: WebApplicationType(枚举类型)
- initializers: List<ApplicationContextInitializer<?>>(构造方法中调用`setInitializers(Collection<? extends ApplicationContextInitializer<?>>)`方法)
- listeners: List<ApplicationListener<?>>(构造方法中调用`setListeners(Collection<? extends ApplicationListener<?>>)`方法)
- mainApplicationClass: Class<?>
webApplicationType
这个属性是Spring自己推断出来的,由方法deduceFromClasspath()
就可以知道。
这个方法的逻辑较为简单,通过加载不同的Class来判断某个Class是否存在,进而推断是SERVLET
还是REACTIVE
或者是NONE
。
推断这个webApplicationType的用处之一是和创建Environment
相关,另外一个就是创建Spring容器(根据访问webApplicationType
变量的位置可知道)。
initializers 和 listeners
这两个属性是通过Spring
的SPI
机制加载的类并创建实例,这里也只是初始化两个属性,无其他逻辑。
mainApplicationClass
根据deduceMainApplicationClass()
方法可知,是遍历当前运行时栈信息,判断方法名是否是main
,是的话就根据类名加载其所在类。