前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >选择Spring Boot项目的内嵌容器

选择Spring Boot项目的内嵌容器

作者头像
阿杜
发布2018-08-06 14:14:50
5020
发布2018-08-06 14:14:50
举报
文章被收录于专栏:阿杜的世界阿杜的世界

Spring Boot工程的默认web容器是Tomcat,但是开发人员可以根据需要修改,例如使用Jetty或者Undertow,Spring Boot提供了对应的starters。

How Do

  • 在pom文件中排除tomcat的starter
代码语言:javascript
复制
<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依赖
代码语言:javascript
复制
<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容器。

代码语言:javascript
复制
@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也存在类似的判断和使用代码:

代码语言:javascript
复制
@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();
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015.12.09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • How Do
  • 分析
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档