这篇介绍一下关于SpringBoot内置Servlet容器的定制和修改
按照传统的SSM框架来进行开发web应用,我们开发测试完之后的步骤往往是把项目打成war包,然后使用ssh类似的协议传到服务器上,同时还要确保服务器上有tomcat之类的运行环境,并且运行时还要保证tomcat运行环境不出错。这样往往导致我们开发后的后续步骤太繁琐.
SpringBoot帮我们内置了Servlet容器,我们现在开发完后可以直接打成jar包,在远程服务器上使用java -jar的命令即可。
SpringBoot默认帮我们选择的Servlet容器是Tomcat,打开IDEA的maven diagram看看依赖关系:
可以看到在starter-web
中内置了tomcat.
之前还可以在我们自己的tomcat上配置一些组件,比如在web.xml和server.xml
这些文件中来进行配置,但现在没有这些文件了,该怎么办呢?
在我的一篇博客中记录到了自动配置类的原理,大家伙可以翻翻哈。SpringBoot帮我们自动装配组件的时候都是根据自动配置类中绑定的对应配置来进行取值的。
现在想要修改,那可以去找到和Tomcat相关的配置绑定类来进行修改tomcat配置。
在SpringBoot中和Tomcat有关配置绑定类是ServerProperties
点进去查看它的源码:
@ConfigurationProperties(
prefix = "server", //相关的属性是server
ignoreUnknownFields = true
)
public class ServerProperties {
private Integer port;
private InetAddress address;
@NestedConfigurationProperty
private final ErrorProperties error = new ErrorProperties();
private ServerProperties.ForwardHeadersStrategy forwardHeadersStrategy;
private String serverHeader;
private DataSize maxHttpHeaderSize = DataSize.ofKilobytes(8L);
private Duration connectionTimeout;
@NestedConfigurationProperty
private Ssl ssl;
@NestedConfigurationProperty
private final Compression compression = new Compression();
@NestedConfigurationProperty
private final Http2 http2 = new Http2();
private final ServerProperties.Servlet servlet = new ServerProperties.Servlet();
private final ServerProperties.Tomcat tomcat = new ServerProperties.Tomcat();
private final ServerProperties.Jetty jetty = new ServerProperties.Jetty();
private final ServerProperties.Netty netty = new ServerProperties.Netty();
private final ServerProperties.Undertow undertow = new ServerProperties.Undertow();
也就是说想要修改一些默认配置,我们只需要去全局配置中修改server.xxx
即可,例如在application.properties中:
server.port=8081
server.context-path=/leslie
server.tomcat.uri-encoding=UTF-8
//通用的Servlet容器设置
server.xxx
//Tomcat的设置
server.tomcat.xxx
这只是第一种方法,还有第二种修改和定制的方法.
编写一个EmbeddedServletContainerCustomizer:嵌入式的Servlet容器的定制器;来修改Servlet容器的配置
@Bean //一定要将这个定制器加入到容器中
public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer(){
return new EmbeddedServletContainerCustomizer() {
//定制嵌入式的Servlet容器相关的规则
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.setPort(8083);
}
};
}
这种方式也可以完成配置,但要加入到容器中,底层会扫描组件。
小记,这两种方式其实本质上都是一样的,因为ServerProperties本质也是EmbeddedServletContainerCustomizer
,所以底层也会扫描它并加载装配相关组件.