SpringBoot之SpringApplication构造方法

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)。

图片1

图2

构造方法

SpringApplication的构造方法,最终调用的是SpringApplication(ResourceLoader, Class<?>...),从此构造方法中看,SpringApplication初始化了6个属性,从上到下分别是:

  1. resourceLoader: ResourceLoader
  2. primarySources: LinkedHashSet<Class<?>>
  3. webApplicationType: WebApplicationType(枚举类型)
  4. initializers: List<ApplicationContextInitializer<?>>(构造方法中调用`setInitializers(Collection<? extends ApplicationContextInitializer<?>>)`方法)
  5. listeners: List<ApplicationListener<?>>(构造方法中调用`setListeners(Collection<? extends ApplicationListener<?>>)`方法)
  6. mainApplicationClass: Class<?>

图3

webApplicationType

这个属性是Spring自己推断出来的,由方法deduceFromClasspath()就可以知道。

图4

这个方法的逻辑较为简单,通过加载不同的Class来判断某个Class是否存在,进而推断是SERVLET还是REACTIVE或者是NONE

推断这个webApplicationType的用处之一是和创建Environment相关,另外一个就是创建Spring容器(根据访问webApplicationType变量的位置可知道)。

initializers 和 listeners

这两个属性是通过SpringSPI机制加载的类并创建实例,这里也只是初始化两个属性,无其他逻辑。

mainApplicationClass

根据deduceMainApplicationClass()方法可知,是遍历当前运行时栈信息,判断方法名是否是main,是的话就根据类名加载其所在类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值