很简单的源码剖析-SpringBoot内嵌Tomcat原理
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);}
}
那些看似简单的事物,其实并不简单。我们之所以觉得他简单,是因为复杂性都被隐藏了。通过上诉代码,大概率可以提出以下几个疑问
- SpringBoot是如何启动内置tomcat的 - 文章的重点
- 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原理相关推荐
- 总结:SpringBoot内嵌Tomcat原理
一.介绍 一般我们启动web服务都需要单独的去安装tomcat,而Springboot自身却直接整合了Tomcat,什么原理呢? 二.原理 SpringBoot应用只需要引入spring-boot-s ...
- SpringBoot内嵌Tomcat原理
1.SpringBoot对SpringMVC的支持 对于一个 SpringBoot web 工程来说,一个主要的依赖标志就是有 spring-boot-starter-web 这个 starter , ...
- Springboot内嵌tomcat
Springboot内嵌tomcat 前言 一.依赖引入starter-web 二.源码截图 tomcat 如何内嵌 三.springboot 如何启动tomcat 前言 一.依赖引入starter- ...
- 指定SpringBoot内嵌Tomcat的版本,修复(CVE-2021-42340)漏洞
1.Tomcat漏洞 近日,Apache Tomcat 发布安全更新,更新了一处拒绝服务漏洞(CVE-2021-42340).攻击者可以通过该漏洞进行拒绝服务攻击.建议广大用户及时升级至最新版本. 1 ...
- 从源码剖析SpringBoot中Tomcat的默认最大连接数
为什么你的websocket只能建立256个连接?推出后,有许多小伙伴问:关键是怎么解决256这个问题.嗯,可能是我的标题起的有点问题,不过如果有认真阅读文章的话,应该会知道,其实256的限制是Chr ...
- tomcat start 无法启动_解密Springboot内嵌Tomcat
Springboot简介 相信大多数开发者对Springboot比较熟悉了,它能够快速地创建一个spring应用,能够完全摒弃XML的配置方式,并且内嵌了Tomcat.Jetty这样的Servlet容 ...
- 解密Springboot内嵌Tomcat
Springboot简介 相信大多数开发者对Springboot比较熟悉了,它能够快速地创建一个spring应用,能够完全摒弃XML的配置方式,并且内嵌了Tomcat.Jetty这样的Servlet容 ...
- springboot内嵌Tomcat启动失败
问题描述 开发需求期间引入友军的二方包,导致服务启动失败,失败日志如下 java.lang.reflect.InvocationTargetExceptionat sun.reflect.Native ...
- springboot内嵌tomcat调优
在springboot-configuration-metadata.json文件下面,有很多属于springboot得喷子hi属性,以下为tomcat的默认配置属性: server.tomcat.a ...
- java版地图源码_TreeMap就这么简单【源码剖析】
前言 声明,本文用得是jdk1.8 前面章节回顾: 本篇主要讲解TreeMap~ 看这篇文章之前最好是有点数据结构的基础: 当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正- 一.Tree ...
最新文章
- PaddlePaddle, TensorFlow, MXNet, Caffe2 , PyTorch五大深度学习框架2017-10最新评测
- c++ 准确计时_C++精确计时
- Tcode SCU3查看table log的error message - 如何查找necessary PFCG role
- java链表实现_链表的原理及java实现
- Log4net数据表
- dentity在Java里是什么意思_注释@Id和@GeneratedValue(strategy = GenerationType.IDENTITY)的用途是什么?为什么世代类型是身份?...
- c语言指针地址交换程序,C语言-基础教程-指针的地址分配
- java集合类中的迭代器
- python编程100例-Python3经典100例(①)
- Python递归、反射、2分查找、冒泡排序
- 【图像分割】基于matlab粒子群优化指数熵图像分割【含Matlab源码 287期】
- 编辑器 的保存怎么绑定事件_小鹿百度编辑器新增小程序URL,抢占百度新流量...
- 用各种编程语言写七夕情书
- html年龄0-120岁正则,正则表达式
- 程序猿怎么利用技术挣钱?——python量化实践
- 保险费率软件测试题目,软件测试保险等价类法测试用例
- 百度研究院发布2022科技趋势预测,涵盖三大层面、十大领域
- 二次开发是什么意思_为什么说初学者都需要一台云服务器
- 为什么要选择网络公关公司压制负面影响,维护好品牌?
- All in 区块链的百度昨日发布了白皮书,说了些什么?
热门文章
- 含泪推荐5款极为实用的软件
- 网页扫雷(简易版)(一)
- svpwm的matlab模型,svpwm的MATLAB仿真实现(转载)
- java课程设计员工信息管理系统,javaweb课程设计之员工信息管理系统
- 使用Echarts实现地图3D效果
- 中专计算机应用基础知识点归纳,《计算机应用基础》各章知识点归纳大全
- 模拟电子技术基础简明课程(第三版)思维导图
- 手机APP数据包抓包分析
- 音创点歌机_音创ktv点歌系统家庭版-音创KTV点歌系统下载 v3.17--pc6下载站
- php数据库 datetime转化时间错,分析php日期转时间戳