Spring Boot默认支持Tomcat,Jetty,和Undertow作为底层容器。而Spring Boot默认使用Tomcat,一旦引入spring-boot-starter-web模块,就默认使用Tomcat容器。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

在启动springboot的时候可谓是相当简单,只需要执行以下代码:

@SpringBootApplication
public class SpringBootMyTestApplication {public static void main(String[] args) {SpringApplication.run(SpringBootMyTestApplication.class, args);}
}

那些看似简单的事物,其实并不简单。我们之所以觉得他简单,是因为复杂性都被隐藏了。通过上诉代码,大概率可以提出以下几个疑问

  1. SpringBoot是如何启动内置tomcat的 - 文章的重点
  2. SpringBoot为什么可以响应请求,他是如何配置的SpringMVC
    这次的重点是先分享SpringBoot是如何启动内置的Tomcat的

1.内嵌Tomcat自动配置原理

1.1 Tomcat服务自动配置类

在SpringBoot的启动过程中会自动加载各个模块下的META-INF/spring.factories文件中定义的自动配置类,Tomcat的服务的加载也是如此,所以首先要找到加载的自动配置,如下图所示:

找到这个配置类进去看一下实现的内容:

可以看到里面也通过@Import注解将EmbeddedTomcat、EmbeddedJetty、EmbeddedUndertow等嵌入式容器类加载进来了,springboot默认是启动嵌入式tomcat容器,如果要改变启动jetty或者undertow容器,需在pom文件中去设置。
这里默认实现的是Tomcat容器,那么看一下EmbeddedTomcat:

进入TomcatServletWebServerFactory类,里面的getWebServer()是关键方法,如图:

继续进入getTomcatWebServer()等方法,一直往下跟到tomcat初始化方法,调用tomcat.start()方法,tomcat就正式开启运行,见图:

走到这里tomcat在springboot中的配置以及最终启动的流程就走完了。

1.2 SpringBoot启动Tomcat

在SpringBoot启动过程中有一个很重要的步骤:

// 刷新应用上下文
refreshContext(context);

内置tomcat的启动就是在这个方法中进行调用的,点击实现的逻辑,最终进到了Spring的源码中:

上面的这个onRefresh()方法就是关键点,点击进行查看源码,onRefresh()会调用到ServletWebServerApplicationContext中的createWebServer(),

private void createWebServer() {WebServer webServer = this.webServer;ServletContext servletContext = getServletContext();if (webServer == null && servletContext == null) {ServletWebServerFactory factory = getWebServerFactory();this.webServer = factory.getWebServer(getSelfInitializer());}else if (servletContext != null) {try {getSelfInitializer().onStartup(servletContext);}catch (ServletException ex) {throw new ApplicationContextException("Cannot initialize servlet context", ex);}}initPropertySources();
}

createWebServer()就是启动web服务,但是还没有真正启动Tomcat,既然webServer是通过ServletWebServerFactory来获取的,先来看一下getWebServerFactory()方法的实现:

protected ServletWebServerFactory getWebServerFactory() {// Use bean names so that we don't consider the hierarchyString[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);if (beanNames.length == 0) {throw new ApplicationContextException("Unable to start ServletWebServerApplicationContext due to missing "+ "ServletWebServerFactory bean.");}if (beanNames.length > 1) {throw new ApplicationContextException("Unable to start ServletWebServerApplicationContext due to multiple "+ "ServletWebServerFactory beans : " + StringUtils.arrayToCommaDelimitedString(beanNames));}return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
}

看最后一步的返回,因为这里使用的是tomcat容器,所以最终返回的就是一个TomcatServletWebServerFactory实例,最终就调用了TomcatServletWebServerFactory类的getWebServer()方法,那么也就实现了tomcat服务的启动。
debug验证一下上述的流程:

2.小结

附上源码流程图:

很简单的源码剖析-SpringBoot内嵌Tomcat原理相关推荐

  1. 总结:SpringBoot内嵌Tomcat原理

    一.介绍 一般我们启动web服务都需要单独的去安装tomcat,而Springboot自身却直接整合了Tomcat,什么原理呢? 二.原理 SpringBoot应用只需要引入spring-boot-s ...

  2. SpringBoot内嵌Tomcat原理

    1.SpringBoot对SpringMVC的支持 对于一个 SpringBoot web 工程来说,一个主要的依赖标志就是有 spring-boot-starter-web 这个 starter , ...

  3. Springboot内嵌tomcat

    Springboot内嵌tomcat 前言 一.依赖引入starter-web 二.源码截图 tomcat 如何内嵌 三.springboot 如何启动tomcat 前言 一.依赖引入starter- ...

  4. 指定SpringBoot内嵌Tomcat的版本,修复(CVE-2021-42340)漏洞

    1.Tomcat漏洞 近日,Apache Tomcat 发布安全更新,更新了一处拒绝服务漏洞(CVE-2021-42340).攻击者可以通过该漏洞进行拒绝服务攻击.建议广大用户及时升级至最新版本. 1 ...

  5. 从源码剖析SpringBoot中Tomcat的默认最大连接数

    为什么你的websocket只能建立256个连接?推出后,有许多小伙伴问:关键是怎么解决256这个问题.嗯,可能是我的标题起的有点问题,不过如果有认真阅读文章的话,应该会知道,其实256的限制是Chr ...

  6. tomcat start 无法启动_解密Springboot内嵌Tomcat

    Springboot简介 相信大多数开发者对Springboot比较熟悉了,它能够快速地创建一个spring应用,能够完全摒弃XML的配置方式,并且内嵌了Tomcat.Jetty这样的Servlet容 ...

  7. 解密Springboot内嵌Tomcat

    Springboot简介 相信大多数开发者对Springboot比较熟悉了,它能够快速地创建一个spring应用,能够完全摒弃XML的配置方式,并且内嵌了Tomcat.Jetty这样的Servlet容 ...

  8. springboot内嵌Tomcat启动失败

    问题描述 开发需求期间引入友军的二方包,导致服务启动失败,失败日志如下 java.lang.reflect.InvocationTargetExceptionat sun.reflect.Native ...

  9. springboot内嵌tomcat调优

    在springboot-configuration-metadata.json文件下面,有很多属于springboot得喷子hi属性,以下为tomcat的默认配置属性: server.tomcat.a ...

  10. java版地图源码_TreeMap就这么简单【源码剖析】

    前言 声明,本文用得是jdk1.8 前面章节回顾: 本篇主要讲解TreeMap~ 看这篇文章之前最好是有点数据结构的基础: 当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正- 一.Tree ...

最新文章

  1. PaddlePaddle, TensorFlow, MXNet, Caffe2 , PyTorch五大深度学习框架2017-10最新评测
  2. c++ 准确计时_C++精确计时
  3. Tcode SCU3查看table log的error message - 如何查找necessary PFCG role
  4. java链表实现_链表的原理及java实现
  5. Log4net数据表
  6. dentity在Java里是什么意思_注释@Id和@GeneratedValue(strategy = GenerationType.IDENTITY)的用途是什么?为什么世代类型是身份?...
  7. c语言指针地址交换程序,C语言-基础教程-指针的地址分配
  8. java集合类中的迭代器
  9. python编程100例-Python3经典100例(①)
  10. Python递归、反射、2分查找、冒泡排序
  11. 【图像分割】基于matlab粒子群优化指数熵图像分割【含Matlab源码 287期】
  12. 编辑器 的保存怎么绑定事件_小鹿百度编辑器新增小程序URL,抢占百度新流量...
  13. 用各种编程语言写七夕情书
  14. html年龄0-120岁正则,正则表达式
  15. 程序猿怎么利用技术挣钱?——python量化实践
  16. 保险费率软件测试题目,软件测试保险等价类法测试用例
  17. 百度研究院发布2022科技趋势预测,涵盖三大层面、十大领域
  18. 二次开发是什么意思_为什么说初学者都需要一台云服务器
  19. 为什么要选择网络公关公司压制负面影响,维护好品牌?
  20. All in 区块链的百度昨日发布了白皮书,说了些什么?

热门文章

  1. 含泪推荐5款极为实用的软件
  2. 网页扫雷(简易版)(一)
  3. svpwm的matlab模型,svpwm的MATLAB仿真实现(转载)
  4. java课程设计员工信息管理系统,javaweb课程设计之员工信息管理系统
  5. 使用Echarts实现地图3D效果
  6. 中专计算机应用基础知识点归纳,《计算机应用基础》各章知识点归纳大全
  7. 模拟电子技术基础简明课程(第三版)思维导图
  8. 手机APP数据包抓包分析
  9. 音创点歌机_音创ktv点歌系统家庭版-音创KTV点歌系统下载 v3.17--pc6下载站
  10. php数据库 datetime转化时间错,分析php日期转时间戳