spring-boot定制和優(yōu)化內(nèi)嵌的Tomcat

springboot為我們內(nèi)嵌了三種容器供我們使用:Tomcat、Jetty和undertow,默認(rèn)使用tomcat

springboot內(nèi)嵌的三種容器

本文介紹兩種方式來定制springboot內(nèi)嵌的Tomcat

第一種方式

@SpringBootConfiguration
public class WebServerConfiguration {

    @Bean
    public EmbeddedServletContainerFactory embeddedServletContainerFactory() {
        TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
        
        //設(shè)置端口號(hào)
        factory.setPort(8888);
        //factory這個(gè)對(duì)象中還有很多的Spring容器級(jí)別的參數(shù)可以設(shè)置,例如我們前幾篇文章中講到的Initializers、Listeners、Tomcat日志等

        //設(shè)置Tomcat連接池...
        //這是以java8的做法來實(shí)現(xiàn)的,事實(shí)上就是編寫一個(gè)內(nèi)部類,不熟悉Java8的讀者可以借鑒下面的實(shí)現(xiàn)方式
        factory.addConnectorCustomizers((connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
            protocol.setMaxThreads(200);
            protocol.setMaxConnections(1000);
            //protocol這個(gè)對(duì)象中還有很多tomcat的參數(shù)可以設(shè)置,讀者可以自己了解了解。
        }));

        /*factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
            @Override
            public void customize(Connector connector) {
                Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                protocol.setMaxThreads(200);
                protocol.setMaxConnections(1000);
            }
        });*/
        return factory;
    }
}

第二種方式

編寫類,實(shí)現(xiàn)EmbeddedServletContainerCustomizer接口,重寫抽象方法,并將這個(gè)類加入spring容器中管理。

@Component
public class MyEmbeddedServletContainerCustomizer implements EmbeddedServletContainerCustomizer {

    @Override
    public void customize(ConfigurableEmbeddedServletContainer container) {
        //和第一種方法一樣,我們又拿到了這個(gè)factory對(duì)象,我們就可以接著搞事情了....
        TomcatEmbeddedServletContainerFactory factory = (TomcatEmbeddedServletContainerFactory) container;
        //......
    }
}

其實(shí),第一種方式來自于springboot源碼的實(shí)現(xiàn),我們可以打開EmbeddedServletContainerAutoConfiguration這個(gè)類閱讀一下源碼。

EmbeddedServletContainerAutoConfiguration.class

springboot源碼的實(shí)現(xiàn)方式和我們的第一種實(shí)現(xiàn)方式一模一樣,只不過源碼作者僅僅是new TomcatEmbeddedServletContainerFactory()而已,并沒有添加任何的配置參數(shù)。紅框的部分我們?cè)?a href="http://www.itdecent.cn/p/b642dfff88db" target="_blank">Spring-Boot autoconfigure之Condition這一小節(jié)講過,當(dāng)spring容器中沒有TomcatEmbeddedServletContainerFactory這個(gè)bean時(shí),才會(huì)把此bean加載進(jìn)Spring容器中。顯然我們自己編寫了一個(gè)Tomcat的Configuration后,圖中的bean將不會(huì)被加載。由于篇幅有限,截圖的這個(gè)類的下面還有jetty、Undertow的代碼,和Tomcat的實(shí)現(xiàn)是一樣的,這里就不介紹了,讀者感興趣可以自己一探究竟。

另外,再介紹一下如何將springboot默認(rèn)使用的tomcat容器換成jetty或其他容器,只需在pom.xml中排除掉spring-boot-starter-tomcat的引用,加上spring-boot-starter-jetty的引用就好了。

好啦,本節(jié)內(nèi)容就到這里,感興趣的讀者可以持續(xù)關(guān)注我的springboot系列博客~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容