容器启动全流程
1.判断当前所属的容器环境
public
2.启动容器的过程
2.1 初始化特定的容器上下文(因为不同容器注入的属性不同)
public
2.2 webServer创建与启动
首先会在refreshContext方法调用refresh方法,这个方法有个空实现叫做onRefresh,交给子类来实现,在Servlet的环境下,他会调用createWebServer方法,那顾名思义就是创建一个webServer
在webServer创建的过程中会调用getWebServerFactory,通过这个工厂类来创建我们的WebServer,默认情况下我们的WebServer是tomcat服务类
@Override
3.Servlet启动
在refresh方法当中的finishRefresh方法,通过startWebServer,将上述步骤创建的webServer进行启动,启动完毕后会调用publishEvent方法发布一个ServletWebServerInitializedEvent事件。
Web容器工厂类加载
getWebServerFactory会去获取String[] beanNames = this.getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);那么这个bean是什么时候注入的呢?
通过一个自动配置类
web容器个性化配置
个性化配置是指可以对tomcat进行属性配置,如修改端口号
- 创建ServletWebServerFactory的bean的过程中,会调用postProcesser的后置处理器。即并不是直接配置tomcat对象,而是先配置Factory对象
- 容器的属性会通过ConfigurationProperties注入到ServerProperties类中,这些类通过自动配置类的@Bean进行导入
- 在后置处理器中调用步骤2中的实现类的customize方法,将属性通过调用bean的setXX方法进行注入(即它把个性化配置的过程挪到bean实例化的后置过程中,而不是加载的时候设置。为了解耦,也为了无个性化配置的区别)