歡迎光臨
每天分享高質量文章

Spring Boot:內嵌容器

Spring Boot工程的預設web容器是Tomcat,但是開發人員可以根據需要修改,例如使用Jetty或者Undertow,Spring Boot提供了對應的starters。

How Do

  • 在pom檔案中排除tomcat的starter

  1.   org.springframework.boot

  •   spring-boot-starter-web

  •  

  •      

  •         org.springframework.boot

  •         spring-boot-starter-tomcat

  •      

  •  

    • 增加Jetty依賴

    1.   org.springframework.boot

  •   spring-boot-starter-jetty

    • 透過 mvn spring-boot:run命令啟動,可以看到Jetty已經啟動。

    PS:如果您使用的gradle,則可以參考官方檔案的做法——Use Jetty instead of Tomcat

    分析

    支援上述切換的原因是Spring Boot的自動配置。我首先在spring-boot-starter-web依賴中排除Tomcat依賴,免得它跟Jetty形成依賴衝突。Spring Boot根據在classpath下掃描到的容器類的型別決定使用哪個web容器。

    在IDEA中檢視EmbeddedServletContainerAutoConfiguration類的內部結構,可以看到 @ConditionalOnClass({Servlet.class,Server.class,Loader.class,WebAppContext.class})這樣的條件匹配註解,如果在Jetty的Jar包中可以找到上述三個類的實體,則決定使用jetty容器。

    1. @Configuration

    2. @ConditionalOnClass({Servlet.class, Server.class, Loader.class, WebAppContext.class})

    3. @ConditionalOnMissingBean(    value = {EmbeddedServletContainerFactory.class},    search = SearchStrategy.CURRENT)

    4. public static class EmbeddedJetty {

    5.    public EmbeddedJetty() {

    6.    }

    7.    @Bean

    8.    public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory() {

    9.        // 傳回容器工廠實體,用於構造容器實體

    10.        return new JettyEmbeddedServletContainerFactory();

    11.    }

    12. }

    同樣得,可以看到對Tomcat也存在類似的判斷和使用程式碼:

    1. @Configuration

    2. @ConditionalOnClass({Servlet.class, Tomcat.class})

    3. @ConditionalOnMissingBean(    value = {EmbeddedServletContainerFactory.class},    search = SearchStrategy.CURRENT)

    4. public static class EmbeddedTomcat {

    5.    public EmbeddedTomcat() {

    6.    }

    7.    @Bean

    8.    public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {

    9.        return new TomcatEmbeddedServletContainerFactory();

    10.    }

    11. }

    贊(0)

    分享創造快樂