springboot省去配置Tomcat的步骤问题

 更新时间:2023年06月07日 10:06:18   作者:改天是哪天.  
这篇文章主要介绍了springboot省去配置Tomcat的步骤问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

前言

这篇文章探索一下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()启动了,并且设置了守护线程防止闪退。

流程图

这里是我理解的一个流程图,这篇所说的大概就包含这些了

总结

好了,不知道看完这篇是不是对SpringBoot中内嵌式容器tomcat有点点的了解了.

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java使用线程池批量处理数据操作具体流程

    Java使用线程池批量处理数据操作具体流程

    这篇文章主要给大家介绍了关于Java使用线程池批量处理数据操作的相关资料,Java多线程编程中线程池是一个非常重要的概念,线程池可以提高线程的复用率和任务调度的效率,尤其是当需要查询大批量数据时,需要的朋友可以参考下
    2023-06-06
  • java必学必会之this关键字

    java必学必会之this关键字

    java必学必会之this关键字,java中this的用法进行了详细的分析介绍,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • Sharding-Jdbc 自定义复合分片的实现(分库分表)

    Sharding-Jdbc 自定义复合分片的实现(分库分表)

    本文主要介绍了Sharding-Jdbc 自定义复合分片的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • SpringBoot Mybatis 配置文件形式详解

    SpringBoot Mybatis 配置文件形式详解

    这篇文章主要介绍了SpringBoot Mybatis 配置文件形式详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Eclipse自定义启动画面和图标的方法介绍

    Eclipse自定义启动画面和图标的方法介绍

    这篇文章主要介绍了Eclipse自定义启动画面和图标的方法介绍,以及一些eclipse的快捷键,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java数据开发辅助工具Docker与普通程序使用方法

    Java数据开发辅助工具Docker与普通程序使用方法

    这是为数据开发人员使用的辅助工具,用于数据库之间的表同步,说同步并不严谨,因为不是实时更新的,更确切的说法是复制,可以方便的从一个数据库复制表到另一个数据库,以下遇到同步的词请理解为复制
    2021-09-09
  • Activiti7通过代码动态生成工作流实现详解

    Activiti7通过代码动态生成工作流实现详解

    这篇文章主要为大家介绍了Activiti7通过代码动态生成工作流实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Netty粘包问题的常见解决方案

    Netty粘包问题的常见解决方案

    粘包和拆包问题也叫做粘包和半包问题,它是指在数据传输时,接收方未能正常读取到一条完整数据的情况(只读取了部分数据,或多读取到了另一条数据的情况)就叫做粘包或拆包问题,本文介绍了Netty如何解决粘包问题,需要的朋友可以参考下
    2024-06-06
  • 简单易懂的java8新特性之lambda表达式知识总结

    简单易懂的java8新特性之lambda表达式知识总结

    一直想针对lambda表达式作一个总结,借助于这次公司安排的考试作一个入门式的总结,对正在学习java的小伙伴们非常有帮助,需要的朋友可以参考下
    2021-05-05
  • 解析Spring事件发布与监听机制

    解析Spring事件发布与监听机制

    本篇文章给大家介绍Spring事件发布与监听机制,通过 ApplicationEvent 事件类和 ApplicationListener 监听器接口,可以实现 ApplicationContext 事件发布与处理,需要的朋友参考下吧
    2021-06-06

最新评论