一、Tomcat相关配置类如何加载的? 在springboot项目中,我们只需要引入spring-boot-starter-web依赖,启动服务成功,我们一个web服务就搭建好了,没有明显的看到tomcat。 其实打开spring-boot-starter-web依
一、Tomcat相关配置类如何加载的?在springboot项目中,我们只需要引入spring-boot-starter-web依赖,启动服务成功,我们一个web服务就搭建好了,没有明显的看到tomcat。 其实打开spring-boot-starter-web依赖,我们可以看到:依赖了tomcat。 1.进入Springboot启动类我们加入Springboot最核心的注解@SpringBootApplication,源码如下图:重点看注解@EnableAutoConfiguration, 2.进入注解@EnableAutoConfiguration如下图:该注解通过@Import注解导入了AutoConfigurationImportSelector类。 其实这个类,就是导入通过加载配置文件,加载了很多工厂方法的配置类。 3.进入AutoConfigurationImportSelector类首先调用selectImport()方法,在该方法中调用了 getAutoConfigurationEntry()方法,在之中又调用了getCandidateConfigurations()方法, getCandidateConfigurations()方法就去META-INF/spring.factory配置文件中加载相关配置类。 详细讲解如下:也就是下图的,方法1调用方法2,方法2调用方法3: 到了这里加载了 META-INF/spring.factories文件: 4.我们看到加载了ServletWebServerFactoryAutoConfiguration这个配置类,web工厂配置类。
从这个配置工厂类,我们看出通过@Import注解加载了tomcat,jetty,undertow三个web服务器的配置类。 由于没有导入jetty和undertow的相关jar包,这两个类实例的不会真正的加载。 5.进入EmbeddedTomcat类创建了TomcatServletWebServerFactory类的对象。
6.进入TomcatServletWebServerFactory类关注getWebServer()方法:
getWebServer()方法在当前类,调用了getTomcatWebServer()方法,其实又new TomcatWebServer()对象:
7.进入TomcatWebServer类这个类才是真正的做tomcat启动的类: (1)构造方法:调用了initialize()方法
(2)进入initialize()方法,这个方法:this.tomcat.start(),启动tomcat容器了。
二、getWebServer()的调用分析,也就是tomcat何时启动的上面分析了tomcat的配置到启动的方法,我们现在来分析,tomcat是何时启动的。 1.首先进入SpringBoot启动类的run方法
最终调用了本类的一个同名方法:
这个方法大概做了以下几件事:
2.那么内置tomcat启动源码就是隐藏在上面第六步:refreshContext方法里面,该方法最终会调 用到AbstractApplicationContext类的refresh()方法,进入refreshContext()方法,如图:
refreshContext()调用了refresh()方法:
refresh()方法调用了this.onRefresh():
如下面的代码:createWebServer() 方法调用了一个factory.getWebServer()。
到了这里getWebServer()方法,下一步就是创建TomcatWebServer对象,创建该对象,就在构造方法启动了Tomcat。详细代码在第一部分有。 总结tomcat启动流程 |
2021-06-05
2021-05-27
2021-05-26
2021-06-05
2021-05-16