当前位置: 首页 > news >正文

从零手写实现 tomcat-08-tomcat 如何与 springboot 集成?

创作缘由

平时使用 tomcat 等 web 服务器不可谓不多,但是一直一知半解。

于是想着自己实现一个简单版本,学习一下 tomcat 的精髓。

系列教程

从零手写实现 apache Tomcat-01-入门介绍

从零手写实现 apache Tomcat-02-web.xml 入门详细介绍

从零手写实现 tomcat-03-基本的 socket 实现

从零手写实现 tomcat-04-请求和响应的抽象

从零手写实现 tomcat-05-servlet 处理支持

从零手写实现 tomcat-06-servlet bio/thread/nio/netty 池化处理

从零手写实现 tomcat-07-war 如何解析处理三方的 war 包?

从零手写实现 tomcat-08-tomcat 如何与 springboot 集成?

从零手写实现 tomcat-09-servlet 处理类

从零手写实现 tomcat-10-static resource 静态资源文件

从零手写实现 tomcat-11-filter 过滤器

从零手写实现 tomcat-12-listener 监听器

前言

开始之前,我们来一起思考下面 3 个问题:

  1. 我们在 springboot 中可以像 main 一样直接启动,如何实现的?

  2. 那么Spring是怎么和Tomcat容器进行集成?

  3. Spring和Tomcat容器的生命周期是如何同步?

1. springboot 中可以像 main 一样直接启动,如何实现的?

在Spring Boot中,应用程序可以像一个普通的Java程序一样,通过一个main方法直接启动,这背后其实是一个挺巧妙的设计。

咱们来接地气地聊聊这是怎么实现的。

首先,你得知道,任何Java程序运行起来,都是因为有一个main方法。这是Java虚拟机(JVM)启动程序时的入口点。

在传统的Java Web项目中,服务器(比如Tomcat)会负责启动和运行,而Spring Boot却可以让你用一个简单的main方法就跑起来。

实现这一点的关键在于Spring Boot的自动配置和内嵌的Servlet容器(比如Tomcat)。

  1. Spring Boot的自动配置:Spring Boot提供了大量的自动配置类,这些类会根据你添加的依赖和配置来自动设置你的Spring应用。比如,如果你添加了Spring Web的依赖,Spring Boot就会自动配置一个Web应用。

  2. 内嵌Servlet容器:Spring Boot允许你不用部署到外部的Servlet容器,而是直接内嵌一个Servlet容器到你的应用中。这意味着你的应用可以包含一个小型的服务器,比如Tomcat或Jetty,它们会在应用启动时自动启动。

  3. SpringApplication类:Spring Boot提供了一个SpringApplication类,它用来启动Spring应用。当你创建一个Spring Boot应用时,你的main方法通常会这样写:

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

这里的YourApplicationClass是你的Spring Boot应用的配置类,它通常会用@SpringBootApplication注解标注,这个注解是Spring Boot应用的标识,它包含了几个其他的注解,包括:

  • @SpringBootConfiguration:标识当前类是一个Spring Boot的配置类。
  • @EnableAutoConfiguration:告诉Spring Boot开启自动配置。
  • @ComponentScan:告诉Spring Boot在哪里查找其他的Bean。
  1. @SpringBootApplication注解:这个注解是启动Spring Boot应用的关键。它让Spring Boot知道这个类是用来启动整个应用的。

当你运行这个main方法时,Spring Boot会利用SpringApplication类来启动你的应用,同时它会根据@SpringBootApplication注解中的配置来自动设置你的应用,包括启动内嵌的Servlet容器。

所以,总结来说,Spring Boot之所以能像一个普通的Java程序一样直接启动,是因为它巧妙地利用了自动配置、内嵌容器和特定的注解来简化了整个启动过程。

这样,你就不需要复杂的部署步骤,只需要一个简单的main方法,就能运行一个完整的Web应用。

2. Spring 是怎么和 Tomcat 容器进行集成?

首先,得明白Spring和Tomcat是两个不同的技术,但它们可以一起工作,就像豆浆和油条,各自独立但又很搭配。

Tomcat 是一个Servlet容器,它的主要工作是处理HTTP请求,比如当你在浏览器里输入网址,Tomcat就会响应这个请求,给你返回网页。

Spring 是一个庞大的Java企业级应用框架,它提供了很多功能,比如依赖注入(DI)、事务管理、安全性等等。

在Web开发中,Spring也提供了对Web应用的支持,比如Spring MVC。

那么,Spring是怎么和Tomcat集成的呢?主要有两种方式:

  1. 独立模式:在这种模式下,Spring和Tomcat是分开的,各干各的活。Tomcat只负责接收HTTP请求,然后它把这些请求转交给Spring来处理。Spring会根据你的配置来决定怎么响应这些请求,比如调用哪个控制器(Controller)来处理请求,然后返回响应。

    这个过程就像是Tomcat是门卫,它负责接待来访的客人(HTTP请求),然后告诉Spring:“有人找你。”Spring再根据具体情况来接待这些客人。

  2. 嵌入式模式:在这种模式下,Spring把Tomcat嵌入到自己的应用中。这意味着你的Spring应用里会包含一个小型的Tomcat服务器。当你运行Spring应用时,这个内嵌的Tomcat服务器也会启动,然后直接处理HTTP请求,而不需要一个单独的Tomcat服务器。

    这种方式就像是Spring自己开了个小店,它不仅负责内部管理,还直接面对客户,处理所有的事务。

无论是哪种模式,Spring和Tomcat的集成都依赖于一些关键的技术:

  • Servlet规范:Java Servlet规范是一个标准,它定义了Java Web应用的运行方式。Spring和Tomcat都遵循这个规范,所以它们可以一起工作。

  • Spring MVC:这是Spring提供的一个Web框架,它遵循MVC(模型-视图-控制器)设计模式。在Spring MVC中,Tomcat的作用主要是接收HTTP请求,然后由Spring MVC的控制器来处理这些请求。

  • Spring Boot:这是Spring的一个子项目,它让Spring应用的配置和部署变得更加简单。在Spring Boot中,你可以很容易地集成Tomcat,因为Spring Boot已经为你做好了大部分配置。

总的来说,Spring和Tomcat的集成就是通过遵循Java Servlet规范,利用Spring MVC和Spring Boot等技术,让Spring应用能够运行在Tomcat上,处理HTTP请求,从而提供Web服务。

3. Spring 和 Tomcat 容器的生命周期是如何同步?

首先,生命周期就是指一个东西从开始到结束的整个过程。

对于软件来说,就是从启动到关闭的这段时间。

PS: 就是我们常说的钩子函数。

Tomcat的生命周期:Tomcat作为一个服务器,它的生命周期很简单。当你启动Tomcat,它就开始监听网络请求,然后你就可以通过浏览器等客户端访问你的网站了。当你关闭Tomcat,它就会停止监听,不再处理任何请求。

Spring的生命周期:Spring的生命周期稍微复杂一些,因为它涉及到很多组件,也就是Spring管理的Bean。Spring的生命周期包括Bean的创建、初始化、使用和销毁。

那么,Spring和Tomcat是如何同步它们的生命周期的呢?这主要通过以下几个步骤:

  1. 启动阶段:当你启动Tomcat时,它会加载Spring的配置文件,然后创建Spring的上下文(ApplicationContext)。这个上下文就是Spring管理所有Bean的地方。在这个过程中,Spring会创建所有的Bean,然后调用它们的初始化方法。

  2. 运行阶段:在Tomcat运行期间,它会不断地接收HTTP请求,并将这些请求转发给Spring处理。Spring会根据配置,找到合适的Bean来处理这些请求。在这个阶段,Bean会被使用,但它们不会被销毁。

  3. 关闭阶段:当你关闭Tomcat时,它会告诉Spring的上下文是时候关闭了。收到这个信号后,Spring会执行一系列的关闭操作,包括调用Bean的销毁方法,然后关闭上下文。这样,所有的Bean都会被正确地销毁,资源会被释放。

在这个过程中,Tomcat和Spring通过一系列的事件和监听器来同步它们的生命周期。Tomcat会发出启动和关闭的事件,而Spring会监听这些事件,并在适当的时候执行自己的生命周期操作。

举个例子,Spring提供了几个生命周期相关的接口,比如InitializingBeanDisposableBean。通过实现这些接口,你可以自定义Bean的初始化和销毁逻辑。当Tomcat启动或关闭时,Spring会调用这些方法,从而实现生命周期的同步。

此外,Spring还提供了一些生命周期相关的事件,比如ContextRefreshedEventContextClosedEvent。这些事件会在Spring上下文刷新和关闭时发出,你可以在Spring应用中监听这些事件,然后执行一些特定的操作。

总的来说,Spring和Tomcat通过监听对方的生命周期事件,并执行相应的操作,实现了它们的生命周期同步。

这样,无论Tomcat何时启动或关闭,Spring都能保证自己的Bean被正确地创建和销毁,从而保证了应用的稳定性和资源的有效利用。

4. 对我们实现 tomcat 的启发?

Spring Boot应用启动时,会创建Spring上下文(ApplicationContext),加载所有的Bean,并初始化它们。

Tomcat启动时,会加载Web应用,初始化Servlet和Listener。

实现自己的Tomcat时,要设计一个清晰的启动流程,确保所有的资源都能被正确加载和初始化。

从零手写例子

 /\_/\  
( o.o ) > ^ <

mini-cat 是简易版本的 tomcat 实现。别称【嗅虎】(心有猛虎,轻嗅蔷薇。)

开源地址:https://github.com/houbb/minicat

相关文章:

从零手写实现 tomcat-08-tomcat 如何与 springboot 集成?

创作缘由 平时使用 tomcat 等 web 服务器不可谓不多&#xff0c;但是一直一知半解。 于是想着自己实现一个简单版本&#xff0c;学习一下 tomcat 的精髓。 系列教程 从零手写实现 apache Tomcat-01-入门介绍 从零手写实现 apache Tomcat-02-web.xml 入门详细介绍 从零手写…...

yarn 安装以及报错处理

前一种报错是由于没有安装yarn导致的&#xff0c;使用以下命令即可安装&#xff1a; npm install -g yarn 如果成功安装&#xff0c;将显示Yarn的版本号。 yarn --version 第二种报错是因为系统上的执行策略限制导致的。执行策略是一种安全功能&#xff0c;用于控制在计算机…...

31万奖金池等你挑战!IJCAI 2024 第九届“信也科技杯”全球AI算法大赛正式开赛!聚焦AI尖端赛题!

文章目录 ⭐️ 赛事概况⭐️ 赛事奖励⭐️ 赛事日程速览⭐️ 报名通道与赛事交流群⭐️ 关于 “信也科技杯”⭐️ 关于信也科技 ⭐️ 赛事概况 随着语音合成技术的不断进步,合成语音与真实语音之间的界限变得模糊,这不仅对数据安全构成威胁,也对科技伦理提出了新的要求。 第九…...

线性表—栈的实现

目录 栈的概念及结构 栈的实现 创建栈 栈的初始化 入栈 出栈 取出栈顶数据 判断栈是否为空 有效数据个数 栈的销毁 全代码 stack.h stack.c 应用 题目 示例 解题思路 代码实现 栈的概念及结构 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入…...

react+antd --- 日期选择器,动态生成日期表格表头

先看一下效果---有当前月的日期 技术&#xff1a; 1&#xff1a; react 2&#xff1a;antd-UI库 -- table 3&#xff1a;moment--时间处理库 代码效果&#xff1a; import { Button, DatePicker, Table } from antd; import { useEffect, useState } from react; import momen…...

webgl入门-js与着色器间的数据传输

js与着色器间的数据传输 前言 课堂目标 使用js向着色器传递数据获取鼠标在canvas 中的webgl 坐标系位置 知识点 attribute 变量gl.vertextAttribute3f() 的同族函数鼠标在canvas 中的css 位置转webgl 坐标位uniform 变量gl.uniform4f() 的同族函数 第一章 用js控制一个点…...

springmvc异常处理

springmvc异常处理 spring中有三种方式可以优雅的处理异常 使用ExceptionHandler 使用HandlerExceptionResolver 使用ControllerAdviceExceptionHandler 使用ExceptionHandler 该方式只在指定的Controller有效&#xff0c;不会对其他的Controller产生影响 ControllerRequestMap…...

可拖动、连线的React画布组件有哪些? 官网分别是什么?

下面是一些常用的可拖动、连线的React画布组件以及它们的官方网站&#xff1a; react-dagre-d3&#xff1a;这是一个基于React和D3.js的可拖动、连线的图形编辑器组件。它使用DAG&#xff08;有向无环图&#xff09;布局算法&#xff0c;支持节点拖拽、连线、缩放等功能。官网&…...

专访 Staynex 创始人 Yuen Wong:酒店行业的变革者

整理&#xff1a;Tia&#xff0c;Techub News 传统酒店业其实已经很中心化了&#xff0c;几大巨头 OTA 平台几乎已经完成对行业的垄断&#xff0c;而酒店商家也不得不受制于平台的规则制度&#xff0c;向平台支付高比例的费用。Staynex 看到了其中的机会&#xff0c;并想利用区…...

最新版Ceph( Reef版本)块存储简单对接k8s(上集)

当前ceph 你的ceph集群上执行 1.创建名为k8s-rbd 的存储池 ceph osd pool create k8s-rbd 64 642.初始化 rbd pool init k8s-rbd3 创建k8s访问块设备的认证用户 ceph auth get-or-create client.kubernetes mon profile rbd osd profile rbd poolk8s-rbd部署 ceph-rbd-csi c…...

稳态大面积光伏组件IV测试太阳光模拟器

稳态大面积光伏组件IV测试太阳光模拟器是太阳能光伏组件质量检测和评价的重要步骤之一。本文将介绍光伏组件IV测试的原理及标准板选择。 I. 光伏组件IV测试原理 光伏组件IV测试即电流电压特性测试&#xff0c;是评估光伏组件性能的重要手段。其测量的主要参数为组件的电流和电…...

编写HTTP协议代理的一些知识(源码)

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 早期上网经常需要使用代理服务…...

LabVIEW天然气压缩因子软件设计

LabVIEW天然气压缩因子软件设计 项目背景 天然气作为一种重要的能源&#xff0c;其压缩因子的准确计算对于流量的计量和输送过程的优化具有关键意义。传统的计算方法不仅步骤繁琐&#xff0c;而且难以满足现场快速响应的需求。因此&#xff0c;开发一款既能保证计算精度又便于…...

GCP谷歌云有什么数据库类型,该怎么选择

GCP谷歌云提供的数据库类型主要包括&#xff1a; 关系型数据库&#xff1a;这类数据库适用于结构化数据&#xff0c;通常用于数据结构不经常发生变化的场合。在GCP中&#xff0c;关系型数据库选项包括Cloud SQL和Cloud Spanner。Cloud SQL提供托管的MySQL、PostgreSQL和SQL Se…...

项目经理之路:裁员与内卷下的生存策略

作为一名项目经理&#xff0c;身处这个充满挑战与机遇的行业中&#xff0c;今年所面临的裁员潮和内卷化趋势无疑给我的工作带来了前所未有的压力。然而&#xff0c;正是这些压力和挑战&#xff0c;让我们更加深刻地思考了在这个快速变化的时代中&#xff0c;我们项目经理应该如…...

MWM触摸屏工控机维修TEM-EV0 EN00-Z312yy-xx

触摸屏维修是一个比较复杂的过程&#xff0c;并且其中会涉及到各个部件的问题&#xff0c;这对于操作人员来说&#xff0c;关键在于是否可以找到问题所在。维修过程中建议先检查各接线接口是否出现松动&#xff0c;然后检查串口及中断号是否有冲突&#xff0c;若有冲突&#xf…...

idm下载到99.99%不动了 idm突然不下载了 idm下载到最后没速度咋办 IDM下载后没网了是怎么回事

idm能够帮助我们下载不同类型的网页视频&#xff0c;并且基于多线程下载技术的助力下使其下载速度比原来提升数倍以上&#xff0c;因此成为了许多朋友下载的小助手。但也有朋友反映idm下载网页视频超时连接不上&#xff0c;idm下载网页视频突然停止&#xff0c;究竟这些情况我们…...

设计模式-07 设计模式-观察者模式(Observer Pattern)

设计模式-07 设计模式-观察者模式&#xff08;Observer Pattern&#xff09; 1.定义 观察者模式是一种软件设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;其中一个对象&#xff08;称为“主题”&#xff09;维护了一个依赖对象的列表&#xff08;称为“观察者”…...

戒烟网站|基于SSM+vue的戒烟网站系统的设计与实现(源码+数据库+文档)

戒烟网站 目录 基于SSM&#xff0b;vue的戒烟网站系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1网站功能模块 2管理员功能模块 3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主…...

研发管理之认识DevOps

文章目录 一、什么是DevOps二、DevOps的背景和起源三、DevOps的特点和价值1、特点&#xff1a;2、价值&#xff1a; 四、DevOps如何帮助提高软件交付速度和质量 一、什么是DevOps DevOps&#xff08;Development和Operations的组合词&#xff09;是一组过程、方法与系统的统称…...

Oh-My-Posh 多会话管理终极指南:在不同终端中保持一致的完美体验

Oh-My-Posh 多会话管理终极指南&#xff1a;在不同终端中保持一致的完美体验 【免费下载链接】oh-my-posh2 A prompt theming engine for Powershell 项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-posh2 Oh-My-Posh 是一款强大的 PowerShell 提示符主题引擎&…...

DSP数字电源方案:C2000系列主控TMS32F28069 Buck-Boost双向变换器(...

DSP数字电源方案 Buck-Boost双向变换器 数字控制方式:C2000系列 主控TMS32F28069 300W&#xff0c;8A&#xff0c;输入10-75V&#xff0c;输出5-75V 双向升降压功率转换器buck-boost结构 提供主板PCB&#xff0c;原理图(AD格式)&#xff0c;源代码&#xff0c;无控制板资料。 …...

开源激活利器:KMS_VL_ALL_AIO全场景应用指南

开源激活利器&#xff1a;KMS_VL_ALL_AIO全场景应用指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 问题&#xff1a;激活困境与技术痛点 个人用户的激活难题 当Windows系统突然弹出激活提…...

FreeCAD Sketcher模块实战:从零开始设计一个机械零件(附约束技巧)

FreeCAD Sketcher模块实战&#xff1a;从零开始设计一个机械零件&#xff08;附约束技巧&#xff09; 在三维CAD设计领域&#xff0c;参数化建模已经成为现代机械设计的标配技能。作为开源CAD软件中的佼佼者&#xff0c;FreeCAD凭借其强大的Sketcher模块&#xff0c;让用户能够…...

生态廊道构建实战指南(1)—Linkage Mapper与Circuitscape环境部署详解

1. 生态廊道构建工具入门指南 第一次接触生态廊道分析的朋友可能会被各种专业术语吓到&#xff0c;其实没那么复杂。简单来说&#xff0c;Linkage Mapper和Circuitscape就是帮我们在数字地图上找出动物迁徙"高速公路"的神器。想象一下&#xff0c;你是一位城市规划师…...

ZYNQMP平台下arm64架构的82599ES万兆网驱动移植实战指南

1. 环境准备与驱动源码获取 在ZYNQMP平台上折腾万兆网卡驱动移植&#xff0c;第一步得把开发环境搭好。我用的是一台Ubuntu 20.04的主机作为开发机&#xff0c;交叉编译工具链用的是Xilinx官方提供的Vitis工具链。这里有个坑要注意&#xff1a;必须确认你的工具链版本和ZYNQMP内…...

实战应用:基于快马打造社交媒体稀有符号昵称生成器

今天想和大家分享一个特别实用的工具开发过程——用InsCode(快马)平台快速搭建社交媒体稀有符号昵称生成器。作为一个经常混迹各种社交平台的用户&#xff0c;我发现在微信、微博、游戏里想取个与众不同的昵称实在太难了&#xff0c;常规字符根本不够炫酷&#xff0c;而手动组合…...

植物大战僵尸终极辅助工具:PVZ Toolkit完整使用指南

植物大战僵尸终极辅助工具&#xff1a;PVZ Toolkit完整使用指南 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit PVZ Toolkit是一款专为经典游戏《植物大战僵尸》PC版设计的开源修改工具&#xff0c…...

Open-AutoGLM自动化测试:用自然语言编写移动应用测试用例

Open-AutoGLM自动化测试&#xff1a;用自然语言编写移动应用测试用例 1. 项目概述 Open-AutoGLM是由智谱AI开源的一款革命性手机端智能助理框架&#xff0c;专为自动化手机操作而设计。该项目基于AutoGLM架构构建&#xff0c;采用Apache-2.0开源协议&#xff0c;完全免费且支…...

7类水面自动驾驶目标检测数据集该数据集已经包括7个类别类别名字分别是:[‘pier‘, ‘ship‘, ‘boat‘, ‘sailor‘, ‘buoy‘, ‘vessel‘, ‘kayak‘]

7类水面自动驾驶目标检测数据集 该数据集已经包括7个类别 类别名字分别是&#xff1a; [pier, ship, boat, sailor, buoy, vessel, kayak] 共计图片54120张&#xff0c;图像分辨率是1920x1080 数据集是txt格式 数据集按照7:1:2已划分为训练集/验证集和测试集 相关YOLOv5/YOLOv6…...