容器启动全流程
1.判断当前所属的容器环境
![v2-3413eea2c866a3fead3cacf8233df414_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=14f9804d-2a2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-3413eea2c866a3fead3cacf8233df414_b.jpg)
public
2.启动容器的过程
2.1 初始化特定的容器上下文(因为不同容器注入的属性不同)
![v2-a37cdb43b6bd3d08af47649d77da5c99_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=14f9804d-2a2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-a37cdb43b6bd3d08af47649d77da5c99_b.jpg)
public
2.2 webServer创建与启动
![v2-c8974613f03022384d886ce094368630_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=14f9804d-2a2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-c8974613f03022384d886ce094368630_b.jpg)
首先会在refreshContext方法调用refresh方法,这个方法有个空实现叫做onRefresh,交给子类来实现,在Servlet的环境下,他会调用createWebServer方法,那顾名思义就是创建一个webServer
![v2-ac5416c2cb5c1707a2f5a3e2ccc2aa82_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=14f9804d-2a2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-ac5416c2cb5c1707a2f5a3e2ccc2aa82_b.jpg)
在webServer创建的过程中会调用getWebServerFactory,通过这个工厂类来创建我们的WebServer,默认情况下我们的WebServer是tomcat服务类
@Override
3.Servlet启动
在refresh方法当中的finishRefresh方法,通过startWebServer,将上述步骤创建的webServer进行启动,启动完毕后会调用publishEvent方法发布一个ServletWebServerInitializedEvent事件。
Web容器工厂类加载
getWebServerFactory会去获取String[] beanNames = this.getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);那么这个bean是什么时候注入的呢?
通过一个自动配置类
![v2-fa7b36efcf3374ba306b52afab50746d_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=14f9804d-2a2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-fa7b36efcf3374ba306b52afab50746d_b.jpg)
![v2-bd4f567f87591cbfa1075700eb88e707_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=14f9804d-2a2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-bd4f567f87591cbfa1075700eb88e707_b.jpg)
web容器个性化配置
个性化配置是指可以对tomcat进行属性配置,如修改端口号
- 创建ServletWebServerFactory的bean的过程中,会调用postProcesser的后置处理器。即并不是直接配置tomcat对象,而是先配置Factory对象
- 容器的属性会通过ConfigurationProperties注入到ServerProperties类中,这些类通过自动配置类的@Bean进行导入
- 在后置处理器中调用步骤2中的实现类的customize方法,将属性通过调用bean的setXX方法进行注入(即它把个性化配置的过程挪到bean实例化的后置过程中,而不是加载的时候设置。为了解耦,也为了无个性化配置的区别)
![v2-3f6572321bb7ed1eec8f489c69d26447_b.png](http://img-02.proxy.5ce.com/view/image?&type=2&guid=14f9804d-2a2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-3f6572321bb7ed1eec8f489c69d26447_b.png)
![v2-4379038737110e19d21ca8223acae92c_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=14f9804d-2a2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-4379038737110e19d21ca8223acae92c_b.jpg)
![v2-07525673d4adc0b351c39c28e5e1862a_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=14f9804d-2a2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-07525673d4adc0b351c39c28e5e1862a_b.jpg)
![v2-996989111e9352ae44ae5024c1fb5bc6_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=14f9804d-2a2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-996989111e9352ae44ae5024c1fb5bc6_b.jpg)