深入拆解 Tomcat & Jetty
李号双
eBay 技术主管
38439 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
开篇词 (1讲)
深入拆解 Tomcat & Jetty
15
15
1.0x
00:00/00:00
登录|注册

28 | 新特性:Spring Boot如何使用内嵌式的Tomcat和Jetty?

为了方便开发和部署,Spring Boot 在内部启动了一个嵌入式的 Web 容器。我们知道 Tomcat 和 Jetty 是组件化的设计,要启动 Tomcat 或者 Jetty 其实就是启动这些组件。在 Tomcat 独立部署的模式下,我们通过 startup 脚本来启动 Tomcat,Tomcat 中的 Bootstrap 和 Catalina 会负责初始化类加载器,并解析server.xml和启动这些组件。
在内嵌式的模式下,Bootstrap 和 Catalina 的工作就由 Spring Boot 来做了,Spring Boot 调用了 Tomcat 和 Jetty 的 API 来启动这些组件。那 Spring Boot 具体是怎么做的呢?而作为程序员,我们如何向 Spring Boot 中的 Tomcat 注册 Servlet 或者 Filter 呢?我们又如何定制内嵌式的 Tomcat?今天我们就来聊聊这些话题。

Spring Boot 中 Web 容器相关的接口

既然要支持多种 Web 容器,Spring Boot 对内嵌式 Web 容器进行了抽象,定义了 WebServer 接口:
public interface WebServer {
void start() throws WebServerException;
void stop() throws WebServerException;
int getPort();
}
各种 Web 容器比如 Tomcat 和 Jetty 需要去实现这个接口。
Spring Boot 还定义了一个工厂 ServletWebServerFactory 来创建 Web 容器,返回的对象就是上面提到的 WebServer。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入拆解 Tomcat & Jetty 》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(25)

  • 最新
  • 精选
  • peter
    "这段代码实现的方法返回一个 ServletRegistrationBean,并将它当作Bean 注册到 Spring 中", 这句话中“注册到Spring中” 是不是错的? 怎么会注册到Spring中? 应该是注册到tomcat servlet容器中吧。

    作者回复: ServletRegisterBean本身是个Bean,由Spring管理,Spring会把这种类型的Bean收集起来,根据Bean里定义向Tomcat注册Servlet。

    11
  • 飞翔
    老师 sprongboot 不注册servlet 给tomcat 直接用@controller 就能实现servlet功能是咋回事呀

    作者回复: springboot默认给我们注册了DispatcherSetvlet。

    3
    11
  • 新世界
    servletContextInitializer实现该接口被spring管理,而不是被servletcontainer管理,是这个意思吗?

    作者回复: 对的

    9
  • 刘冬
    和"飞翔"同问: 有@RestController,为什么还要自己去注册Servlet给Tomcat? 我感觉老师很善于将负责的问题、长的逻辑链讲的简洁清晰,还请老师帮忙详细说明一下。 谢谢!

    作者回复: 可能有些场景需要注册你自己写的一个Servlet提供辅助功能,与主程序分开

    2
    7
  • despacito
    老师,springboot 中 getWebServer方法的实现类不仅有tomcat,还有其他web容器,比如jetty,那为什么我们在运行启动类的时候默认都是用的tomcat容器,如果我运行启动类的时候想用jetty作为应用容器,应该怎么做?

    作者回复: 在pom文件中去掉对Tomcat的依赖,加入对jetty的依赖: <dependencies> <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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> </dependencies>

    3
    5
  • Royal
    您好,想请教下jetty的NetworkTrafficListener.Adapter机制,有什么博客可以推荐吗?谢谢

    作者回复: Jetty的资料比较少,我一般是看官网和源码

  • 雪山飞狐
    通过 ServletContextInitializer 接口可以向 Web 容器注册 Servlet,实现 ServletContextInitializer 接口的Bean被speing管理,但是在什么时机触发其onStartup()方法的呢? 谜底就是通过 Tomcat 中的 ServletContainerInitializer 接口实现者,如TomcatStarter,创建tomcat时设置了该类,在tomcat启动时会触发ServletContainerInitializer实现者的onStartup()方法,在这个方法中触发ServletContextInitializer接口的onStartup()方法,如注册DispatcherServlet。
    4
  • 张凤霞在三门峡
    更多细节: DispatcherServletRegistrationBean实现了ServletContextInitializer接口,它的作用就是向Tomcat注册DispatcherServlet,那它是在什么时候、如何被使用的呢? 答案:老师提到了prepareContext方法,但没展示代码内容,它调用了另一个私有方法configureContext,这个方法就包括了往tomcat的Context添加ServletContainerInitializer对象: context.addServletContainerInitializer(starter, NO_CLASSES); 其中有上面提到的DispatcherServletRegistrationBean。
    1
    2
  • 蒙开强
    老师,你好,如果我不想使用内嵌的Tomcat,想用自己装的Tomcat,那需要怎么做呢
    2
  • 红颜铭心
    相同点:向ServletContext容器注册Servlet,Filter或EventListener 不同点:生命周期由不同的容器托管,在不同的地方调用,最终的结果都是一样。 内嵌容器不支持ServletContainerInitializer,因此不能通过spi方式加载ServletContainerInitializer, 而是用TomcatStarter的onStartup,间接启动ServletContextInitializers,来达到ServletContainerInitializer的效果。
    1
收起评论
显示
设置
留言
25
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部