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,是的话就根据类名加载其所在类。
511

被折叠的 条评论
为什么被折叠?



