鍍金池/ 教程/ Java/ 選擇Spring Boot項目的內(nèi)嵌容器
通過JMX監(jiān)控Spring Boot應用
Spring Boot:定制PropertyEditors
配置是否初始化Bean的方法
Spring Boot的自動配置、Command-line Runner
Spring Boot:定制URL匹配規(guī)則
Spring Boot的自動配置、Command-line Runner
利用Mockito模擬DB
Spring Boot應用的打包和部署
了解Spring Boot的自動配置
Spring Boot應用的健康監(jiān)控
了解Spring Boot的自動配置
初始化數(shù)據(jù)庫和導入數(shù)據(jù)
Spring Boot應用的健康監(jiān)控
Docker with Spring Boot
RESTful by Spring Boot with MySQL
Spring Boot:定制攔截器
Spring Boot:定制static path mappings
Spring Boot with Mysql
Spring Boot:定制自己的starter
在測試中使用內(nèi)存數(shù)據(jù)庫
Restful: Spring Boot with Mongodb
Spring Boot with Redis
Spring Boot:定制HTTP消息轉(zhuǎn)換器
Spring Boot: Data Rest Service
Spring Boot:定制type Formatters
在Spring Boot項目中使用Spock框架
選擇Spring Boot項目的內(nèi)嵌容器
通過EmbeddedServletContainerCustomizer接口調(diào)優(yōu)Tomcat
Spring Boot應用的打包和部署
Spring Boot Admin的使用
讓你的Spring Boot工程支持HTTP和HTTPS
Spring Boot:定制servlet filters
Spring Boot:定制URL匹配規(guī)則
Spring Boot應用的測試——Mockito
Spring Boot應用的測試——Mockito
Spring Boot:定制servlet filters
通過@Enable*注解觸發(fā)Spring Boot配置

選擇Spring Boot項目的內(nèi)嵌容器

Spring Boot工程的默認web容器是Tomcat,但是開發(fā)人員可以根據(jù)需要修改,例如使用Jetty或者Undertow,Spring Boot提供了對應的starters。

How Do

  • 在pom文件中排除tomcat的starter
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
   <exclusions>
      <exclusion>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-tomcat</artifactId>
      </exclusion>
   </exclusions>
</dependency>
  • 增加Jetty依賴
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
  • 通過mvn spring-boot:run命令啟動,可以看到Jetty已經(jīng)啟動。

http://wiki.jikexueyuan.com/project/spring-boot-cookbook-zh/images/556.png" alt="Jetty容器啟動" />

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

分析

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

在IDEA中查看EmbeddedServletContainerAutoConfiguration類的內(nèi)部結(jié)構(gòu),可以看到@ConditionalOnClass({Servlet.class, Server.class, Loader.class, WebAppContext.class})這樣的條件匹配注解,如果在Jetty的Jar包中可以找到上述三個類的實例,則決定使用jetty容器。

@Configuration
@ConditionalOnClass({Servlet.class, Server.class, Loader.class, WebAppContext.class})
@ConditionalOnMissingBean(    value = {EmbeddedServletContainerFactory.class},    search = SearchStrategy.CURRENT)
public static class EmbeddedJetty {
    public EmbeddedJetty() {
    }
    @Bean
    public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory() {
        // 返回容器工廠實例,用于構(gòu)造容器實例
        return new JettyEmbeddedServletContainerFactory();
    }
}

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

@Configuration
@ConditionalOnClass({Servlet.class, Tomcat.class})
@ConditionalOnMissingBean(    value = {EmbeddedServletContainerFactory.class},    search = SearchStrategy.CURRENT)
public static class EmbeddedTomcat {
    public EmbeddedTomcat() {
    }
    @Bean
    public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
        return new TomcatEmbeddedServletContainerFactory();
    }
}