首先说启动过程,下一篇说自动配置的过程
创建了SpringApplication之后,调用它的run方法,启动
创建父容器
准备容器,设置了小部分信息
然后开始刷新容器
摆了一道
回到熟悉的那个方法,不过其中有些改变,只看改变的那些方法,而且到现在,web容器和子容器都还没启动
第一个:
第二个:
第三个:也是重头戏
创建Tomcat的工厂,然后通过工厂启动web服务,需要需要注意的是 getSelfInitializer,是父容器的一个钩子,在web服务启动之后会跳转回来
红框的上一个方法,将能用的初始化器合在一起,然后通过configureContext,以starter的形式设置到web容器中了,这里没进去看,感兴趣的可自己看
容器搞定之后,开始启动web服务
其实这里跳过了很多很多层,因为它一直在套娃,start然后startInternal,重复了几个轮回,然后到了chirld.start的时候,是通过线程池异步提交任务的形式执行,所以这里的线程不是主线程,然后里面还会套娃,感兴趣可以自己走走看,
然后最后是在这个方法,onStartup,执行了最终逻辑,也就是前面提过的 钩子执行了
虽然是异步,不过现在还是回来 父容器上
主要就是把父容器放到web容器中
这个方法其实就是将父容器注册到web容器,然后顺手注册了子容器,不过没有实例化它,实例化是等到有请求来的时候,web容器调用servlet的初始化启动子容器,这个和springMVC的时候有所区别,而且启动的顺序也不一样了,
springMVC的时候,是web容器先启动,然后执行监听器启动父容器,然后通过servlet初始化启动子容器
但在springBoot中是先启动父容器,然后启动web容器,异步注册父容器,子容器是延迟到有请求的时候才创建
到此,SringBoot的启动过程,大致上走了一遍,至于自动化配置,其实也只能看到注解如何扫描我们需要的bean,这个其实上文也有提及,但是对于注解扫描到的信息执行时机以及注解对应的实现,其实都是通过各种postProcessor实现
在容器刷新过程中,有非常多的扩展时机,而在SpringBoot中就是充分运用了这些扩展,实现的自动化配置。