首先说启动过程,下一篇说自动配置的过程

spring 启动SRS spring启动过程源码详解_spring 启动SRS

spring 启动SRS spring启动过程源码详解_web服务_02

spring 启动SRS spring启动过程源码详解_spring_03

spring 启动SRS spring启动过程源码详解_spring 启动SRS_04

spring 启动SRS spring启动过程源码详解_spring_05

spring 启动SRS spring启动过程源码详解_web容器_06

spring 启动SRS spring启动过程源码详解_web容器_07

spring 启动SRS spring启动过程源码详解_spring 启动SRS_08

创建了SpringApplication之后,调用它的run方法,启动

spring 启动SRS spring启动过程源码详解_web服务_09

创建父容器

spring 启动SRS spring启动过程源码详解_web服务_10

spring 启动SRS spring启动过程源码详解_web服务_11

准备容器,设置了小部分信息

spring 启动SRS spring启动过程源码详解_spring 启动SRS_12

spring 启动SRS spring启动过程源码详解_web服务_13

spring 启动SRS spring启动过程源码详解_web服务_14

然后开始刷新容器

spring 启动SRS spring启动过程源码详解_spring_15

spring 启动SRS spring启动过程源码详解_spring 启动SRS_16

spring 启动SRS spring启动过程源码详解_web容器_17

摆了一道

spring 启动SRS spring启动过程源码详解_spring_18

回到熟悉的那个方法,不过其中有些改变,只看改变的那些方法,而且到现在,web容器和子容器都还没启动

spring 启动SRS spring启动过程源码详解_web容器_19

spring 启动SRS spring启动过程源码详解_web容器_20

第一个:

spring 启动SRS spring启动过程源码详解_web服务_21

第二个:

spring 启动SRS spring启动过程源码详解_spring 启动SRS_22

spring 启动SRS spring启动过程源码详解_web容器_23

第三个:也是重头戏

spring 启动SRS spring启动过程源码详解_spring 启动SRS_24

创建Tomcat的工厂,然后通过工厂启动web服务,需要需要注意的是 getSelfInitializer,是父容器的一个钩子,在web服务启动之后会跳转回来

spring 启动SRS spring启动过程源码详解_spring_25

spring 启动SRS spring启动过程源码详解_web容器_26

spring 启动SRS spring启动过程源码详解_web服务_27

红框的上一个方法,将能用的初始化器合在一起,然后通过configureContext,以starter的形式设置到web容器中了,这里没进去看,感兴趣的可自己看

spring 启动SRS spring启动过程源码详解_spring_28

容器搞定之后,开始启动web服务

spring 启动SRS spring启动过程源码详解_web容器_29

spring 启动SRS spring启动过程源码详解_spring 启动SRS_30

spring 启动SRS spring启动过程源码详解_web服务_31

spring 启动SRS spring启动过程源码详解_web容器_32

spring 启动SRS spring启动过程源码详解_spring 启动SRS_33

spring 启动SRS spring启动过程源码详解_web服务_34

spring 启动SRS spring启动过程源码详解_web容器_35

spring 启动SRS spring启动过程源码详解_spring 启动SRS_36

其实这里跳过了很多很多层,因为它一直在套娃,start然后startInternal,重复了几个轮回,然后到了chirld.start的时候,是通过线程池异步提交任务的形式执行,所以这里的线程不是主线程,然后里面还会套娃,感兴趣可以自己走走看,

然后最后是在这个方法,onStartup,执行了最终逻辑,也就是前面提过的 钩子执行了

spring 启动SRS spring启动过程源码详解_spring 启动SRS_37

虽然是异步,不过现在还是回来 父容器上

spring 启动SRS spring启动过程源码详解_spring 启动SRS_38

spring 启动SRS spring启动过程源码详解_spring 启动SRS_39

spring 启动SRS spring启动过程源码详解_web服务_40

主要就是把父容器放到web容器中

spring 启动SRS spring启动过程源码详解_web服务_41

spring 启动SRS spring启动过程源码详解_web容器_42

 

这个方法其实就是将父容器注册到web容器,然后顺手注册了子容器,不过没有实例化它,实例化是等到有请求来的时候,web容器调用servlet的初始化启动子容器,这个和springMVC的时候有所区别,而且启动的顺序也不一样了,

springMVC的时候,是web容器先启动,然后执行监听器启动父容器,然后通过servlet初始化启动子容器

但在springBoot中是先启动父容器,然后启动web容器,异步注册父容器,子容器是延迟到有请求的时候才创建

到此,SringBoot的启动过程,大致上走了一遍,至于自动化配置,其实也只能看到注解如何扫描我们需要的bean,这个其实上文也有提及,但是对于注解扫描到的信息执行时机以及注解对应的实现,其实都是通过各种postProcessor实现

在容器刷新过程中,有非常多的扩展时机,而在SpringBoot中就是充分运用了这些扩展,实现的自动化配置。