前续
为帮助广大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·
—如果喜欢,快分享给你的朋友们吧—
我们一起愉快的玩耍吧
领取专属 10元无门槛券
私享最新 技术干货