springboot为我们内嵌了三种容器供我们使用:Tomcat、Jetty和undertow,默认使用tomcat
springboot内嵌的三种容器
本文介绍两种方式来定制springboot内嵌的Tomcat
第一种方式
@SpringBootConfigurationpublic 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容器中管理。
@Componentpublic class MyEmbeddedServletContainerCustomizer implements EmbeddedServletContainerCustomizer { @Override public void customize(ConfigurableEmbeddedServletContainer container) { //和第一种方法一样,我们又拿到了这个factory对象,我们就可以接着搞事情了.... TomcatEmbeddedServletContainerFactory factory = (TomcatEmbeddedServletContainerFactory) container; //...... } }
其实,第一种方式来自于springboot源码的实现,我们可以打开EmbeddedServletContainerAutoConfiguration
这个类阅读一下源码。
EmbeddedServletContainerAutoConfiguration.class
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系列博客~
作者:八目朱勇铭
链接:https://www.jianshu.com/p/4ee2628b1cb5