总结:SpringBoot内嵌Tomcat原理

news2024/11/25 3:03:32

一、介绍

一般我们启动web服务都需要单独的去安装tomcat,而Springboot自身却直接整合了Tomcat,什么原理呢?

二、原理

SpringBoot应用只需要引入spring-boot-starter-web中这个依赖,应用程序就默认引入了tomcat依赖,其实这主要是Tomcat本身提供的外部接口(org.apache.catalina.startup.Tomcat),使其它应用程序能够非常方便的将Tomcat嵌入到自身的应用来。
下面是从网络上找的一个自身的程序嵌入如何实现嵌入式Tomcat,达到和Springboot类似的效果:

<dependency>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
  </dependency>

定义一个简单的一个servlet类(提供web服务):

public class DemoServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
            throws IOException, ServletException {
        response.setContentType("text/html");
        response.setCharacterEncoding("UTF-8");
        PrintWriter out = response.getWriter();

        out.println("<!DOCTYPE html><html>");
        out.println("<head>");
        out.println("<meta charset="UTF-8" />");
        out.println("<title></title>");
        out.println("</head>");
        out.println("<body bgcolor="white">");
        out.println("<h1> 嵌入式tomcat</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

定义一个EmbeddedTomcatServer类,主程序执行入口:

EmbeddedTomcatServer类作为程序的入口,代码逻辑其实就是通过tomcat提供的外部接口类修改server.xml这个文件;

public class EmbeddedTomcatServer {
    public static void main(String[] args) throws Exception {
        //把目录的绝对的路径获取到
        String classpath = System.getProperty("user.dir");
        System.out.println(classpath);
        //new一个Tomcat
        Tomcat tomcat = new Tomcat();

        //插件是6或者6以前的
        //Embbedded
        //设置Tomcat的端口
        //tomcat.setPort(9090);
        Connector connector = tomcat.getConnector();
        connector.setPort(9091);
        //设置Host
        Host host = tomcat.getHost();
        //我们会根据xml配置文件来
        host.setName("localhost");
        host.setAppBase("webapps");
        //前面的那个步骤只是把Tomcat起起来了,但是没啥东西
        //要把class加载进来,把启动的工程加入进来了
        Context context = tomcat.addContext(host, "/", classpath);

        if (context instanceof StandardContext) {
            StandardContext standardContext = (StandardContext) context;
            standardContext.setDefaultContextXml("E:\apache-tomcat-8.5.51\conf\web.xml");
            //我们要把Servlet设置进去
            Wrapper wrapper = tomcat.addServlet("/", "DemoServlet", new DemoServlet());
            wrapper.addMapping("/embeddedTomcat");
        }
        //Tomcat跑起来
        tomcat.start();
        //强制Tomcat server等待,避免main线程执行结束后关闭
        tomcat.getServer().await();
    }

}

在这里插入图片描述

 

三、SpringBoot接入原理

SpringBoot嵌入Tomcat的原理其实和上面的案例是一样的,我们来看下代码:

首先进入run方法,并点击refreshContext(context)方法:

 

 

 

 

 如下可知,底层就是用的Tomcat类实现。

 

参考:

SpringBoot内嵌Tomcat原理剖析_普通网友的博客-CSDN博客_springboot内嵌tomcat原理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/52514.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]SSM计算机毕业设计疫情环境下的酒店管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【HAL库】STM32CubeMX开发----STM32F407----ETH+LAN8720A+LWIP----ping通

STM32CubeMX 下载和安装 详细教程 【HAL库】STM32CubeMX开发----STM32F407----目录 LAN8720A数据手册(中文英文) 前言 本次实验以 STM32F407VET6 芯片为MCU&#xff0c;使用 25MHz 外部时钟源。 以太网PHY层芯片为 LAN8720A&#xff0c;由MCU引脚 PA8 提供时钟。 LAN8720A引脚…

springboot整合mybatis实现增删改查

前言 在学习Springboot过程中&#xff0c;整合mybatis框架实现表数据的增删改查&#xff0c;话不多说&#xff0c;开始贴代码&#xff01; Spring Boot提供了一个名为spring-boot-starter-parent的工程&#xff0c;里面已经对各种常用依赖(并非全部)的版本进行了管理&#xff…

基于51单片机智能IC卡电表控制系统

资料编号&#xff1a;201 功能介绍&#xff1a; 采用51单片机作为主控CPU&#xff0c;使用按键进行模拟冲卡&#xff08;模拟缴费冲卡&#xff09;&#xff0c;通过按键来控制当前是否使用电力&#xff0c;并且LCD1602实时显示当前电力可用量剩余多少&#xff0c;当电力余额不…

3. JVM对象创建与内存分配机制

1. JVM对象创建过程详解 对象创建的主要流程 1.1 分配内存空间的方法 指针碰撞&#xff08;默认使用指针碰撞&#xff09; 如果JAVA堆中内存是绝对规整的&#xff0c;所有用过的内存都放在一边&#xff0c;空闲的内存放在另一边&#xff0c;中间放一个指针作为分界点&#xf…

Tableau长期免费使用的方法总结

目录方法一&#xff1a;使用Tableau Public第一步&#xff1a;在Product中点击Tableau Public第二步&#xff1a;向下滚动找到下载链接第三步&#xff1a;进入下载页面点击下载方法二&#xff1a;每一个可下载版本滚动试用14天第一步&#xff1a;**resource** → **support** →…

06【SpringMVC的Restful支持】

文章目录六、SpringMVC的Restful支持6.1 RESTFUL示例&#xff1a;6.2 基于restful风格的url6.3 基于Rest风格的方法6.4 配置HiddenHttpMethodFilter6.5 Restful相关注解六、SpringMVC的Restful支持 REST&#xff08;英文&#xff1a;Representational State Transfer&#xff…

.vcxproj.filters 误删后如何重建

背景&#xff1a; 今天碰到这样一种情况&#xff0c;我在删除这个VS文件夹下的.user文件时&#xff0c;不小心把.vcxproj.filters也删除了。当然为什么删.user呢&#xff0c;因为换电脑了。 删除之后&#xff0c;我发现&#xff1a;我的解决方案目录变成这样了&#xff1a; 对…

基于springboot企业客户信息反馈平台设计与实现的源码+文档

摘 要 网络的广泛应用给生活带来了十分的便利。所以把企业客户信息反馈管理与现在网络相结合&#xff0c;利用java技术建设企业客户信息反馈平台&#xff0c;实现企业客户信息反馈的信息化。则对于进一步提高企业客户信息反馈管理发展&#xff0c;丰富企业客户信息反馈管理经…

数据分析:从界定问题开始做数据分析?

一、引言 “界定问题”是数据分析工作流程的第一步,也是最重要的一步。再怎么强调“界定问题”的重要性都不为过,因为一旦没有把问题界定清楚,后续的工作很可能将会南辕北辙。而如果我们将问题界定清楚,就能针对性的制定解决方案。 1.什么是界定问题 界定问题是一个需求…

黄健翔质疑半自动越位技术?用「技术流」解读卡塔尔世界杯

昨天&#xff0c;喀麦隆3比3塞尔维亚的比赛&#xff0c;黄健翔发微博质疑「半自动越位识别技术」太慢&#xff0c;而且没有考虑观众的需求&#xff0c;严重影响看球的体验&#xff0c;巴西和瑞士的比赛&#xff0c;黄健翔连发三条微博&#xff0c;再次吐槽VAR技术对足球带来的伤…

Qt | QTextCodec类使用详解、GBK和UTF8编码互转、QString的toLocal8bit和toLatin1区别

Qt | QTextCodec类使用详解、GBK和UTF8编码互转、QString的toLocal8bit和toLatin1区别 目录Qt | QTextCodec类使用详解、GBK和UTF8编码互转、QString的toLocal8bit和toLatin1区别1、QTextCodec简介及使用1.1 编码之间的转换1.2 解决中文显示乱码问题2、QString的toLocal8bit和t…

Python——基本数据类型的转换

1、为什么需要左数据类型的转换 2、转换为整形&#xff1a; 浮点类型转换为整形&#xff1a; a 3.14 b int(a) print(b) 浮点类型转换成整形的规则是&#xff1a;保留小数点前面的数&#xff0c;去掉小数点和小数点后面的数。 字符串转换成整形&#xff1b; a 123 b int(a…

PHP怎么实现实时聊天?GatewayWorker+Thinkphp5即时通讯系统实现

PHP怎么实现实时聊天&#xff1f;GatewayWorkerThinkphp5即时通讯系统实现 一、项目介绍 后端技术&#xff1a;thinkphp5fastadmingatewayworker 前端技术&#xff1a;jqueryhtmlcsswebsocket 项目实现了简单的登录、注册功能&#xff0c;会员可进行后台管理&#xff0c;主界…

[OpenCV实战]52 在OpenCV中使用颜色直方图

颜色直方图是一种常见的图像特征&#xff0c;顾名思义颜色直方图就是用来反映图像颜色组成分布的直方图。颜色直方图的横轴表示像素值或像素值范围&#xff0c;纵轴表示该像素值范围内像素点的个数或出现频率。颜色直方图属于计算机视觉中的基础概念&#xff0c;其常常被应用于…

Ceres库中参数理解

1 参数含义 2 参考链接 Modeling Non-linear Least Squares — Ceres Solver (ceres-solver.org) Ceres详解&#xff08;二&#xff09; CostFunction_他人是一面镜子&#xff0c;保持谦虚的态度的博客-程序员宝宝_ceres costfunction - 程序员宝宝 (cxybb.com)

Linux基础知识与实操-篇七:用户身份切换与特殊控制

文章目录使用者身份的切换配置sudo单一用户群组处理有限制的命令操作特殊shell与PAM模块Linux用户信息传递与当前系统上其他用户对话建立大量账号最后在理解了前篇 篇六:用户权限控制与账号管理 后&#xff0c;我们继续深入用户权限控制关于用户身份切换、限制特殊权限相关的内…

一步步带你用react+spring boot搭建后台之二(登录与首页篇)

前言 最近半年一直在重庆忙于项目上的事情&#xff0c;博客停更了好久&#xff0c;一直想写2个开源项目: 一个是入门级&#xff1a;一步步带你用reactspring boot搭建后台 一个是olap应用系列&#xff1a;一步步构建olap分析平台 今天开始写第一个系列&#xff0c;完整代码随…

LDO(线性稳压器)设计检查

原理图设计规范检查——LDO&#xff08;线性稳压器&#xff09;设计检查 LDO基本概念&#xff1a; LDO即low dropout regulator&#xff0c;是一种低压差线性稳压器&#xff0c;这是相对于传统的线性稳压器来说的。传统的线性稳压器&#xff0c;如78XX系列的芯片都要求输入电…

Linux cifs挂载远程windows共享目录

Linux cifs挂载远程windows共享目录共享windows目录开启共享权限共享磁盘或目录Linux 先决条件安装Linux依赖开启Administrator 用户使用Username/Password挂载临时挂载自动挂载使用Credentials挂载创建CIFS Windows共享凭证文件临时挂载自动挂载终止挂载共享windows目录 开启…