您的位置:首页 > 编程语言 > Java开发

选择Spring Boot项目的内嵌容器

2017-10-17 15:42 465 查看
原文链接:http://www.jianshu.com/p/70233f90859c

Spring Boot工程的默认web容器是Tomcat,但是开发人员可以根据需要修改,例如使用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已经启动。



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();
}
}

原文链接:http://www.jianshu.com/p/70233f90859c
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: