springboot省去配置Tomcat的步骤问题
作者:改天是哪天. 发布时间:2023-03-13 18:58:44
前言
这篇文章探索一下springboot的tomcat是如何实现的
一、起步依赖
1.首先我们了解一下起步依赖
SpringBoot结合Maven管理,无需关注不同的依赖,不同版本是否存在冲突的问题。
通过spring-boot-starter-parent、spring-boot-starter等实现依赖的传递、版本管理等
SpringBoot存在大量的spring-boot-starter-xxx。这些依赖对某种或某类功能进行了组织,从而达到了起步依赖的目的。
2.上图直观的看依赖关系
我们平常创建好一个SpringBoot项目初始化就会依赖一个spring-boot-starter,当我们想启动项目的时候,就必须在添上 -web让他成为一个spring-boot-starter-web项目。
为什么呢?我们点击进去,这里看
是了!它引入了tomcat的依赖,并且仔细观看后还有一些其它的依赖
可以看到,当我们把第一层pom中的spring-boot-starter改变为了spring-boot-starter-web,进来后这个web中又引入了spring-boot-starter!
这里也引入了webMVC的依赖
二、追踪源码
把pom中改成web项目后启动看看 这里成功启动了
啊这,细心一点的话可以看到中间的路径类,发现目标TomcatWebServer
1.TomcatWebServer
可以看到他有一个成员变量属性tomcat,并且实现了一个WebServer的接口,那这个WebServer的关系是什么样呢?
这个接口原来不单单一个tomcat,还有其它可以代替tomcat的Web容器。
看它的构造方法,这个构造参数中的tomcat是谁传入进来的?
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.monitor = new Object();
this.serviceConnectors = new HashMap();
Assert.notNull(tomcat, "Tomcat Server must not be null");
this.tomcat = tomcat;
this.autoStart = autoStart;
this.initialize();
}
我们继续往下追踪
2.TomcatServletWebServerFactory
原来是这个类new了一个TomcatWebServer,并且传入了一个tomcat类。
protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) {
return new TomcatWebServer(tomcat, this.getPort() >= 0);
}
那么TomcatServletWebServerFactory类中getTomcatWebServer的方法参数tomcat是谁传入的呢?我们接着找。
阿,果然还是你,通过本类getWebServer方法返回值调用了getTomcatWebServer,那么看看这个日日念念的tomcat是怎么来的呢
原来是在这个方法中new了一个tomcat对象!
三、结尾
我们再来看TomcatWebServer的构造方法
public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
this.monitor = new Object();
this.serviceConnectors = new HashMap();
Assert.notNull(tomcat, "Tomcat Server must not be null");
this.tomcat = tomcat; //赋值给类中属性
this.autoStart = autoStart;
this.initialize();//初始化方法
}
现在应该知道了吧,其实底层就是new了一个tomcat对象。经过这样一轮传值传到这个类的构造方法,然后赋值给这个类中的tomcat成员变量,最后调用初始化方法即可
来看看初始化 initialize() 方法
调用这个方法,其中start()启动了,并且设置了守护线程防止闪退。
流程图
这里是我理解的一个流程图,这篇所说的大概就包含这些了
来源:https://blog.csdn.net/weixin_44355855/article/details/108845427


猜你喜欢
- 几个月前写过一篇博客《xUtils3.0框架学习笔记》 ,上面也有记录通过xUtils实现文件上传的使用方法,代码如下:private vo
- 一、C# Thread类的基本用法通过System.Threading.Thread类可以开始新的线程,并在线程堆栈中运行静态或实例方法。可
- 写完布局后 我们一般需要 findViewById找到这个控件,但是现在有一个很好用的插件ButterKnife 可以一键转化布局文件中的所
- 其实早在.NET 4.5的时候M$就在.NET中引入了async和await关键字(VB为Async和Await)来简化异步调用的编程模式。
- SpeSqliteManager4Android改动日志2023.2.14 完成SQLiteOpenHelper 2023.2.23 完成r
- 本文实例讲述了Java操作redis实现增删查改功能的方法。分享给大家供大家参考,具体如下:首先,我们需要在windows下配置一个redi
- 1.springboot 2.0 默认连接池就是Hikari了,所以引用parents后不用专门加依赖2.贴我自己的配置(时间单位都是毫秒)
- Android 中ScrollView与ListView冲突问题的解决办法自定义MyListViewpublic class MyListV
- IDEA安装后,前进 后退快捷按钮默认不在工具栏显示,需要手动将其添加到工具栏*按照图一选中Toolbar Run Actions ,点击右
- 不废话了,直接给大家贴代码了。class term { String str; int id; &
- 向shell提供命令非常简单,需要学习的注解很少。该命令的实现风格与使用依赖注入的应用程序的开发类相同,您可以利用Spring容器的所有特性
- 基本思想基数排序(RadixSort)是在桶排序的基础上发展而来的,两种排序都是分配排序的高级实现。分配排序(DistributiveSor
- 一、Jvm加载对象在说Java * 之前,还是要说一下Jvm加载对象的过程,这个依旧是理解 * 的基础性原理:Java类即源代码程序.j
- 成为一名优秀的软件开发工程师,设计模式的重要性不言而喻,本章节是对设计模式的前置知识概述,涉及概念性较大,读者可在设计模式学习过程中参阅本文
- 最近帮朋友做了一个动画菜单,感觉有一定的实用价值,就在此给大家分享一下,先看看效果:实现思路:从图中可以看出,这三个(或更多,需要自己再实现
- 什么是Socket? 所谓Socket通常也称作“套接字”,用于描述IP地址和端口
- 我们知道,进入百度图片后,输入一个关键字后,首先看到的是很多缩略图,当我们点击某张缩略图时,我们就可以进入到大图显示页面,在大图显示页面,中
- 发现问题肯定有人发现连接mysql失败,然后又找不到问题所在,又出现一大最报错,如下图。解决过程 1.先查询自己的java版本,在
- Linux下JDK安装教程,具体内容如下1、下载 JDK Linux 版本(注意看自己安装 Linux 系统的位数)oracle 官网下载地
- MyBatis的注解实现复杂映射开发实现复杂关系映射之前我们可以在映射文件中通过配置来实现,使用注解开发后,我们可以使用@Results注解