image
3.2.2
3.2.3
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));  // 将启动类从数组重新封装成了 Set,注⼊到primarySources 属性
3.2.4
this.webApplicationType = WebApplicationType.deduceFromClasspath();  // 得到 web应⽤的类型,
这⾥是 SERVLET webApplicationType 有三种类型,REACTIVE、SERVLET、NONE
引⼊ spring-boot-starter-web 包,就是 SERVLET
引⼊ spring-boot-starter-webflux 包,是 REACTIVE
都没有就是 NONE
3.2.5
this.bootstrapRegistryInitializers = new ArrayList<>(getSpringFactoriesInstances(BootstrapRegistryInitializer.class));
从 META-INF/spring.factories ⽂件中得到 key 为 org.springframework.boot.BootstrapRegistryInitializer 的全类名集合,进⾏实例化,然后注⼊ bootstrapRegistryInitializers 属性
站长导航源码
这⾥⼤家先记下 getSpringFactoriesInstances ⽅法,等下详细介绍
3.2.6
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
image
image
这⼀⾏代码,只是封装了⼀下,仍然还是调⽤ getSpringFactoriesInstances ⽅法,从 META-INF/spring.factories ⽂件中得到 key 为t.ApplicationContextInitializer 的全类名集合,进⾏实例化,然后注⼊ initializers(初始化器集合) 属性。
3.2.7
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));  // 同理,得到实例的集合,并注⼊3.2.8
this.mainApplicationClass = deduceMainApplicationClass();  // 获取当前运⾏的 main ⽅法所在的类,也就是咱们的主类
3.3 执⾏ run ⽅法
3.3.1 ⽅法总览
image
我们回到这个⽅法体,进⼊ run ⽅法
image
image
⽅法有点长。。。,没关系,我们捡重点看看
3.3.2
long startTime = System.nanoTime();  // 记录⼀个开始时间戳
3.3.3
DefaultBootstrapContext bootstrapContext = createBootstrapContext();  // 添加了⼀个默认的 Bootstrap 上下⽂
image
从代码看,就是 new 了⼀个 DefaultBootstrapContext 实例,然后遍历初始化了 bootstrapRegistryIniti
alizers 中的所有初始化器
还记得 bootstrapRegistryInitializers 属性吗,3.2.5 章节中,实例化 SpringApplication 时通过getSpringFactoriesInstances ⽅法获得并注⼊的。
3.3.4
configureHeadlessProperty();  // 配置Headless属性
3.3.5
SpringApplicationRunListeners listeners = getRunListeners(args);  // 获得 RunListener 集合类
image
这⾥我们⼜看到了熟悉的 getSpringFactoriesInstances,这次的 key 是 org.springframework.boot.SpringApplicationRunListener EventPublishingRunListener 对象
这⾥会得到 EventPublishingRunListener 对象
3.3.6
listeners.starting(bootstrapContext, this.mainApplicationClass);  // 循环启动这些

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。