springboot为我们内嵌了三种容器供我们使用:Tomcat、Jetty和undertow,默认使用tomcat
本文介绍两种方式来定制springboot内嵌的Tomcat
第一种方式
@SpringBootConfiguration
public class WebServerConfiguration {
@Bean
public EmbeddedServletContainerFactory embeddedServletContainerFactory() {
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
//设置端口号
factory.setPort(8888);
//factory这个对象中还有很多的Spring容器级别的参数可以设置,例如我们前几篇文章中讲到的Initializers、Listeners、Tomcat日志等
//设置Tomcat连接池...
//这是以java8的做法来实现的,事实上就是编写一个内部类,不熟悉Java8的读者可以借鉴下面的实现方式
factory.addConnectorCustomizers((connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
protocol.setMaxThreads(200);
protocol.setMaxConnections(1000);
//protocol这个对象中还有很多tomcat的参数可以设置,读者可以自己了解了解。
}));
/*factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
protocol.setMaxThreads(200);
protocol.setMaxConnections(1000);
}
});*/
return factory;
}
}
第二种方式
编写类,实现EmbeddedServletContainerCustomizer
接口,重写抽象方法,并将这个类加入spring容器中管理。
@Component
public class MyEmbeddedServletContainerCustomizer implements EmbeddedServletContainerCustomizer {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
//和第一种方法一样,我们又拿到了这个factory对象,我们就可以接着搞事情了....
TomcatEmbeddedServletContainerFactory factory = (TomcatEmbeddedServletContainerFactory) container;
//......
}
}
其实,第一种方式来自于springboot源码的实现,我们可以打开EmbeddedServletContainerAutoConfiguration
这个类阅读一下源码。
springboot源码的实现方式和我们的第一种实现方式一模一样,只不过源码作者仅仅是new TomcatEmbeddedServletContainerFactory()
而已,并没有添加任何的配置参数。红框的部分我们在Spring-Boot autoconfigure之Condition这一小节讲过,当spring容器中没有TomcatEmbeddedServletContainerFactory这个bean时,才会把此bean加载进Spring容器中。显然我们自己编写了一个Tomcat的Configuration后,图中的bean将不会被加载。由于篇幅有限,截图的这个类的下面还有jetty、Undertow的代码,和Tomcat的实现是一样的,这里就不介绍了,读者感兴趣可以自己一探究竟。
另外,再介绍一下如何将springboot默认使用的tomcat容器换成jetty或其他容器,只需在pom.xml中排除掉spring-boot-starter-tomcat的引用,加上spring-boot-starter-jetty的引用就好了。
好啦,本节内容就到这里,感兴趣的读者可以持续关注我的springboot系列博客~