详解SpringBoot内嵌Tomcat的自动装配

前续

为帮助广大SpringBoot用户达到“知其然,更需知其所以然”的境界,作者将通过SpringBoot系列文章全方位对SpringBoot2.0.0.RELEASE版本深入分解剖析,让您深刻的理解其内部工作原理。

No.1 什么是自动装配

因为在SpringBoot的spring-boot-autoconfigure-2.0.0.RELEASE.jar中做了很多默认配置项,俗称“自动装配”。

SpringBoot自动配置会根据添加的依赖,自动加载依赖相关的配置属性并启动依赖,比如我们现在讨论的内嵌Tomcat。

为什么要自动装配

利用自动装配模式代替XML配置模式,比如使用SpringMVC时,需要配置组件扫描、调度器、试图解析器等,现在有了自动装配,这些都可以不用配置了,SpringBoot默认已经帮我们配置好了。

自动装配的组成部分

自动化配置本身包含了两部分:@ Configuration的定义和properties属性的定义(俗称“外化配置”),外化化配置是跟加载过程相关的。

如何自定义自动装配

spring.factoriesd文件中配置的是SpringBoot自动配置类,

如何排除自动装配

通过 exclude 属性指定并排除自动配置类,代码如下:

也等价于配置在 @EnableAutoConfiguration 注解,代码如下:

自动配置会最大的智能化,当配置了 exclude 属性时,Spring Boot 优先初始化用户定义的 Bean ,然后在进行自动化配置。

No.2 ServletWebServerFactoryAutoConfiguration

通过上一篇文章,我们了解到如果我们的应用是WEB应用的话,SpringBoot启动时会自动启动内嵌的WEB服务器,而且在默认情况下,启动的是内嵌的Tomcat服务器。

我们通过ServletWebServerFactoryAutoConfiguration来分析一下原因,该类具体代码如下:

从该类上的注解可以知道,该类注入的条件是:

在项目的classpath路径下存在ServletRequest类,才能注入ServletWebServerFactoryAutoConfiguration

当前应用是Servlet Web 应用,才能注入ServletWebServerFactoryAutoConfiguration

从这里可以知道,在SpringBoot中的内嵌SERVLET-WEB服务器有:Tomcat、Jetty和Undertow三种。

注入了两个Bean:

No.3 WebServerFactoryCustomizer

WebServerFactoryCustomizer是SpringBoot2.0.0版本才有的用于自定义Web服务器工厂的策略接口。在服务器本身启动之前,任何此类bean都将获得服务器工厂的回调,因此您可以设置端口,地址,错误页面等。

在SpringBoot中内置提供了如下实现类:

一旦应用访问了WebServerFactory,通常可以向它添加定制器来配置特定的部件,比如连接器、服务器资源或服务器本身相关的任何配置,这些都使用特定于服务器的API。

还可以声明自己的WebServerFactory组件,该组件将覆盖SpringBoot提供的组件。在这种情况下,您不能再依赖于服务器名称空间中的配置属性。

在SpringBoot1.0中,通过EmbeddedServletContainerCustomizer接口来调优Tomcat的自定义配置。

在SpringBoot2.0中,通过WebServerFactoryCustomizer接口来调优Tomcat的自定义配置。

No.4 修改内置Tomcat配置

通过上面的分析,我们都知道SpringBoot是内置了Tomcat服务器,那么问题来了,我们如何修改其配置呢?

其实SpringBoot默认配置了Tomcat相关的属性,可以参考org.springframework.boot.autoconfigure.web.ServerProperties类,

但是我们可以在application.properties文件中进行自定义修改,具体代码如下:

No.5 如何去除Tomcat

在No.2中我们知道之所以会使用内嵌的Tomcat,是因为在ServletWebServerFactoryAutoConfiguration类中具有如下代码:

这是一个条件注册Bean(只有在满足条件的情况下才会注册该Bean),即在当前应用的classpath路径下存在

类,则会注册该Bean,从而使用内嵌的Tomcat容器。

如果我们不想使用内嵌的Tomcat服务器,那么我们只需要去除引人的Tomcat的jar即可,具体(Maven)代码如下:

则不会使用内嵌的Tomcat服务器了。

如果我们想使用内嵌的Jetty服务器呢?也很简单,添加jetyy的依赖,(Maven)代码如下:

这样就使用内嵌的Jetty服务器了。类似的也可以使用内嵌的Undertow服务器。

后记

为帮助广大SpringBoot用户达到“知其然,更需知其所以然”的境界,作者将通过SpringBoot系列文章全方位对SpringBoot2.0.0.RELEASE版本深入分解剖析,让您深刻的理解其内部工作原理。

本系列历史文章列表

·end·

—如果喜欢,快分享给你的朋友们吧—

我们一起愉快的玩耍吧

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180717G1RLQ200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券