springboot3嵌入式容器源码解析

问题分析 

不同于使用springmvc,在我们使用springboot时无需配置tomcat就可以直接使用,这就说明springboot已经在我们启动项目时将tomcat配置好了,接下来我们就来看看springboot底层是怎么实现的。

源码解析

ServletWebServerFactoryAutoConfiguration类

springboot3嵌入式容器源码解析_第1张图片

在该类中从外部引入了  ServletWebServerFactoryConfiguration.EmbeddedTomcat类

 springboot自动配置tomcat的关键就是 TomcatServletWebServerFactory工厂类。

springboot3嵌入式容器源码解析_第2张图片

 通过名字我们大概就可以知道这是一个专门创建WebServer的工厂类。

springboot3嵌入式容器源码解析_第3张图片

 在该工厂类中有一个getwebServer的方法,在其中new tomcat类,在该方法中对tomcat类进行了各项的赋值。也就是说只要通过该工厂类的方法就可以创建一个tomcat的服务器。

从上述我们可以知道springboot在启动时的自动配置中,往ioc容器中配置了一个tomcatWebserver的生成工厂。

 此时产生了一个新问题:那仅仅就是添加了一个生成工厂,springboot是怎么调用该工厂的呢?

 源码分析

通过对 getWebServer方法的调用的层次结构

被 ServletWebServerApplicationContext中的createWebServe调用。

springboot3嵌入式容器源码解析_第4张图片

createWebServer被 onRefresh方法调用。 springboot3嵌入式容器源码解析_第5张图片

 通过onRefresh这方法名我们就可以知道这个方法的作用大概就是重新加载的意思。其被AbstractApplicationContext的方法refresh调用,此方法就是项目启动时执行的。 (可以将refresh理解为初始化)

springboot3嵌入式容器源码解析_第6张图片onRefresh方法就是刷新spring子容器。

springboot3嵌入式容器源码解析_第7张图片

 最终完成tomcat服务器的创建。

当然springboot不单单支持tomcat,其默认支持三种服务器。

springboot3嵌入式容器源码解析_第8张图片

springboot3嵌入式容器源码解析_第9张图片 如果我们需要切换为其他的服务器类型,此时我们只需要修改依赖即可。

更改服务器配置步骤为下:

1.在 spring-boot-starter-web依赖中排除spring-boot-starter-tomcat依赖。

2.添加其他两种类型服务器的start依赖。

自定义ServletWebServerFactory

如果我们添加的服务器不属于这三种我们也可以自定义ServletWebServerFactory。

springboot3嵌入式容器源码解析_第10张图片

 如果自定义了服务器工厂,默认自动配置的工厂就会失效。我们通过配置类将服务器工厂配置到ioc容器即可。

总结

1.第一步: 启动springboot项目,先自动将默认的配置类配置到ioc容器,此时默认的服务器工厂类就会配置到ioc中,如果有自定义服务器工厂类,则会将自定义的工厂类配置到ioc容器中,默认的配置失效。

2.第二步:Spring容器刷新(启动)的时候,会预留一个时机,刷新子容器。调用onRefresh()方法,创建tomcat服务器。

3.在配置文件中通过server关键字配置服务器的其他信息

springboot3嵌入式容器源码解析_第11张图片 

你可能感兴趣的:(SpringBoot,Java,Spring,java,spring,boot,spring)