问题分析
不同于使用springmvc,在我们使用springboot时无需配置tomcat就可以直接使用,这就说明springboot已经在我们启动项目时将tomcat配置好了,接下来我们就来看看springboot底层是怎么实现的。
源码解析
ServletWebServerFactoryAutoConfiguration类
在该类中从外部引入了 ServletWebServerFactoryConfiguration.EmbeddedTomcat类
springboot自动配置tomcat的关键就是 TomcatServletWebServerFactory工厂类。
通过名字我们大概就可以知道这是一个专门创建WebServer的工厂类。
在该工厂类中有一个getwebServer的方法,在其中new tomcat类,在该方法中对tomcat类进行了各项的赋值。也就是说只要通过该工厂类的方法就可以创建一个tomcat的服务器。
从上述我们可以知道springboot在启动时的自动配置中,往ioc容器中配置了一个tomcatWebserver的生成工厂。
此时产生了一个新问题:那仅仅就是添加了一个生成工厂,springboot是怎么调用该工厂的呢?
源码分析
通过对 getWebServer方法的调用的层次结构
被 ServletWebServerApplicationContext中的createWebServe调用。
createWebServer被 onRefresh方法调用。
通过onRefresh这方法名我们就可以知道这个方法的作用大概就是重新加载的意思。其被AbstractApplicationContext的方法refresh调用,此方法就是项目启动时执行的。 (可以将refresh理解为初始化)
onRefresh方法就是刷新spring子容器。
最终完成tomcat服务器的创建。
当然springboot不单单支持tomcat,其默认支持三种服务器。
如果我们需要切换为其他的服务器类型,此时我们只需要修改依赖即可。
更改服务器配置步骤为下:
1.在 spring-boot-starter-web依赖中排除spring-boot-starter-tomcat依赖。
2.添加其他两种类型服务器的start依赖。
自定义ServletWebServerFactory
如果我们添加的服务器不属于这三种我们也可以自定义ServletWebServerFactory。
如果自定义了服务器工厂,默认自动配置的工厂就会失效。我们通过配置类将服务器工厂配置到ioc容器即可。
总结
1.第一步: 启动springboot项目,先自动将默认的配置类配置到ioc容器,此时默认的服务器工厂类就会配置到ioc中,如果有自定义服务器工厂类,则会将自定义的工厂类配置到ioc容器中,默认的配置失效。
2.第二步:Spring容器刷新(启动)的时候,会预留一个时机,刷新子容器。调用onRefresh()方法,创建tomcat服务器。
3.在配置文件中通过server关键字配置服务器的其他信息