Spring Boot工程的預設web容器是Tomcat,但是開發人員可以根據需要修改,例如使用Jetty或者Undertow,Spring Boot提供了對應的starters。
How Do
-
在pom檔案中排除tomcat的starter
org.springframework.boot
-
增加Jetty依賴
org.springframework.boot
-
透過
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容器。
@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() {
// 傳回容器工廠實體,用於構造容器實體
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();
}
}