【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】

Spring源码深度解析 Spring Boot 体系原理总结 Spring Boot 特点如下: 创建独立的 Spring 应用程序; 嵌入的 Tomcat ,无须部署 WAR 文件; 简化 Maven 配置; 自动配置 Spring; 提供生产就绪型功能,如指标、健康检查和外部配置; 绝对没有代码生成,以及对 XML 没有配置要求 首先搭建一个 maven 工程, pom 如下: 然后建立一个 controller 类 最后再加入启动整个项目的 main 函数 最后启动main函数并在浏览器中输入localhost:8080 第一个 Starter spr 阅读详情

一.知识回顾

【0.SpringBoot专栏的相关文章都在这里哟,后续更多的文章内容可以点击查看】
【1.SpringBoot初识之Spring注解发展流程以及常用的Spring和SpringBoot注解】
【2.SpringBoot自动装配之SPI机制&SPI案例实操学习&SPI机制核心源码学习】
【3.详细学习SpringBoot自动装配原理分析之核心流程初解析-1】
【4.详细学习SpringBoot自动装配原理之自定义手写Starter案例实操实战-2】
【5.IDEA中集成SpringBoot源码环境详细步骤讲解】
【6.初识SpringBoot核心源码之SpringApplication构造器以及run方法主线流程-3】
【7.详细学习SpringBoot核心源码之SpringApplication构造器&Run方法源码详细流程-4】
【8.详细学习SpringBoot核心源码之监听器原理-5(观察者设计模式、初始化并加载监听器核心流程、事件的发布器核心流程、SpringBoot中默认的监听器以及默认的事件类型)】
【9.详细学习SpringBoot源码之自定义监听器实战演练-6(自定义监听器、自定义监听事件、指定监听事件)】
【10.详细学习SpringBoot源码之属性配置文件加载原理(application.properties|application.yaml)-7】
【11.详细学习SpringBoot源码之属性配置文件加载原理(Bootstrap.properties|Bootstrap.yml)-8】

在这里插入图片描述

二.Tomcat源码环境构建

2.1 源码构建方式-官网下载

Tomcat官方网站

在这里插入图片描述

在这里插入图片描述

2.2 源码构建方式-GitHub下载

GitHub上查找Tomcat对应的版本

在这里插入图片描述

选择对应的对应的版本进行下载
在这里插入图片描述

三.Maven环境搭建

3.1 环境准备

打开IEDA导入项目,然后在项目中创建一个新的pom.xml文件,里面的内容为:
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
            http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.apache.tomcat</groupId>
  <artifactId>apache-tomcat</artifactId>
  <version>8.5</version>

  <dependencies>
    <dependency>
      <groupId>org.apache.ant</groupId>
      <artifactId>ant</artifactId>
      <version>1.10.4</version>
    </dependency>
    <dependency>
      <groupId>wsdl4j</groupId>
      <artifactId>wsdl4j</artifactId>
      <version>1.6.2</version>
    </dependency>
    <dependency>
      <groupId>javax.xml</groupId>
      <artifactId>jaxrpc-api</artifactId>
      <version>1.1</version>
    </dependency>
    <dependency>
      <groupId>org.eclipse.jdt.core.compiler</groupId>
      <artifactId>ecj</artifactId>
      <version>4.5.1</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13</version>
    </dependency>
  </dependencies>

  <build>
    <finalName>apache-tomcat</finalName>
    <sourceDirectory>java</sourceDirectory>
    <resources>
      <resource>
        <directory>java</directory>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.6.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

然后设置项目为Maven项目,选中pom.xml文件,鼠标右点。选择 Add as Maven Project .
等待依赖导入成功后的响应。
在这里插入图片描述

3.2 启动项目并解决中文乱码问题

中文乱码问题的解决方案,修改两处地方即可:

1.修改org.apache.jasper.compiler包目录结构下Localizer类getMessage(java.lang.String)方法
在这里插入图片描述

在这里插入图片描述

2.修改org.apache.tomcat.util.res包下StringManager类的getString(java.lang.String)

在这里插入图片描述
启动项目
在这里插入图片描述
运行结果展示:
在这里插入图片描述

3.3 解决不支持JSP的问题

启动成功后,在访问首页的时候,出现了500错误,而且提示 无法为JSP编译类。

image.png

原因是无法编译jsp。解决也很简单,按照下面步骤操作即可

上面的报错解决方式,可以在org.apache.catalina.startup包下ContextConfig类中的configureStart方法中,添加一下JSP解析器初始化即可

添加JSP初始化操作,完成JSP的支持
在这里插入图片描述
访问测试,启动成功
在这里插入图片描述
至此,Tomcat源码就导入成功了,我们可以大致的学习一下Tomcat相关的概念。后续我们在Tomcat专栏中学习Tomcat源码相关的知识,敬请期待。接下来我们来学习一下在SpringBoot源码中Tomcat的加载原理分析。

四.SpringBoot中内嵌Tomcat启动原理分析

4.1 查看SpringBoot中自动装配的类

4.1.1 EmbeddedWebServerFactoryCustomizerAutoConfiguration

在这里插入图片描述

在这个配置类里面就是根据我们的配置来内嵌对应的Web容器,比如Tomcat或者Jetty、Undertow。
内嵌tomcat服务
在这里插入图片描述

4.1.2 ServletWebServerFactoryAutoConfiguration

  然后来看下ServletWebServerFactoryAutoConfiguration这个配置类。

在这里插入图片描述

  首先来看下在类的头部引入和一些核心的信息

在这里插入图片描述

重点我们需要看下EmbeddedTomcat这个内部类。

在这里插入图片描述

看到的核心其实是创建了一个TomcatServletWebServerFactory对象并注入到了Spring容器中。这块的内容非常重要,是我们后面串联的时候的一个切入点。

4.2 Tomcat启动流程

有了上面的自动配置类的支持我们就可以看看在SpringBoot的run方法中是在哪个位置帮我们内嵌了Tomcat容器呢?首先我们从SpringBoot的run方法的刷新上下文的方法进入。

在这里插入图片描述

这部分其实就是Spring的核心代码了,我们进入到onrefresh()方法。

在这里插入图片描述

继续进入:
在这里插入图片描述

然后我们进入ServletWebServerApplicationContext对象的onRefresh方法中。

在这里插入图片描述

核心方法 createWebServer() 创建我们的Tomcat容器

image.png

可以看到,从容器中获取的工厂对象其实就我们上面注入的对象,然后根据工厂对象获取到了一个TomcatWebServer实例,也就是Tomcat服务对象。关键点我们需要看下getWebServer方法的逻辑

在这里插入图片描述
Tomcat中获取getWebServer的相关方法
image.png

然后继续进入到 getTomcatWebServer方法中。

在这里插入图片描述

进入构造方法查看

在这里插入图片描述

进入Tomcat初始化的方法initialize方法

在这里插入图片描述

进入start方法,接下来的逻辑操作就是Tomcat自身启动的逻辑流程了

在这里插入图片描述
好了,关于【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】就先学习到这里,更多的内容持续创作学习中。
在这里插入图片描述

Spring Boot框架知识总结(超详细) IOC容器填加相应依赖配置可以实现在自定义配置properties配置提示@ConfigurationProperties(prefix = “person”)注解的作用是将配置文件中以person开头的属性值通过setXX()方法注入到实体类对应属性中。@Component注解的作用是将当前注入属性值的Person类对象作为Bean组件放到Spring容器中,只有这样才能被@ConfigurationProperties注解进行赋值。 阅读详情

相关推荐

SpringBoot应用从Tomcat迁移至东方通TongWeb实战指南

在Java Web应用开发中,Servlet容器是承载应用运行的核心组件,它负责处理HTTP请求、管理Servlet生命周期并提供会话管理等基础服务。其工作原理是基于Java EE(现Jakarta EE)的Servlet规范,通过定义标准的接口和生命周期,使得应用能够与底层网络通信解耦。这项技术的核心价值在于为Java Web应用提供了可移植、可扩展的运行环境。随着信息技术应用创新(信创)和软件供应链安全要求的提升,国产化中间件在金融、政务等关键领域的应用场景日益广泛。本文聚焦于将SpringBoot应用

weixin_34006468的博客 503

SpringBoot 源码分析(四) 内置Tomcat分析

Tomcat文件的目录结构。

springsdl的博客 778

SpringBoot3.x启动流程与优化实践

SpringBoot作为Java生态的主流框架,其启动机制是理解框架设计的核心。本文从模块化设计、事件机制等基础概念切入,解析SpringBoot3.x相比2.x版本在启动速度、云原生适配等方面的改进。通过BootstrapRegistryInitializer等新特性,开发者可以在Spring上下文创建前注册基础组件,特别适用于微服务架构中的注册中心集成。结合自动配置加载路径变化、条件评估缓存等优化点,3.x版本在容器初始化、环境准备等关键阶段实现了15%-20%的性能提升。这些改进使SpringBoot

weixin_33713503的博客 314

springboot源码解析(三):springboot内嵌tomcat

在使用springboot搭建一个web应用程序的时候,我们发现不需要自己搭建一个tomcat服务器,只需要引入spring-boot-starter-web,在应用启动时会自动启动嵌入式的tomcat作为服务器,下面来分析下源码的分析流程:之前我们已经讲过了自动装配的原理,其实tomcat的实现机制也是从自动装配开始的。 @Configuration(proxyBeanMethods = false) @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) @Con

yf_1018的博客 588

WPS接入DeepSeek,实现AI辅助功能

总的来说,借助 WPS 中宏功能与 DeepSeek 大模型的结合,文档处理、内容创作和数据分析等任务都能更加智能化、自动化。这不仅大幅提升了工作效率,也为办公场景带来了全新的智能化办公体验。

运维老生常谈 3804

利用Android系统漏洞实现后台弹窗(外弹)

关键:从 Android 8.0(API 26)开始,禁止使用 context.sendBroadcast() 发送隐式广播(即没有指定 setPackage() 或明确组件的广播)。demo核心代码展示利用Android显示系统和广播系统的漏洞实现在后台弹窗的功能,支持最新Android15,16版本。核心功能都是在so层去做,大量使用了jni反调, 如果要上架到应用市场,需要对代码做进一步混淆,加固以应对市场安全扫描。3,开启虚拟显示窗口,这是个透明像素窗口。5,可开启一个线程,调用这个外弹窗口。

2018,再出发~ 1316

【Spring-boot框架】内嵌Tomcat,启动项目

第二步:创建一个启动类Start,使用@SpringBootApplication注解,运行main方法,即可启动spring boot。spring boot真的好好用哦,在单位试了这个,不行,今天回来直接就好了,开心~第四步:在浏览器输入:localhost:8080/start/springboot。第三步:写一个接口,/start/springboot。第一步:pom.xml文件中加入以下依赖。出现如下图及说明项目启动成功!

weixin_55205599的博客 1876

S7-1200模拟量

将两种不同的金属或合金金属焊接起来,构成一个闭合回路,利用温差电动势来测量温度,当两端存在温度梯度时,回路中就会有电流通过,此时两端之间就存在电动势--热电动势,这就是所谓的塞贝克效应(seebeck effect)。温差越大,热电动势越高。热电偶是有正负极性的,所以需要确保导线连接到正确的极性,否则会造成明显的测量误差。为了使温度补偿达到最佳效果,必须将热电偶模块安装在温度稳定的环境中简述:两种金属,每一种金属随温度变化是不同的,出现温差--由俩金属构成的回路就会有电流经过,因此两端形成热电动势。

王阿妹小天才的博客 2591

springboot-内置Tomcat

本文介绍是springboot是怎么内置Tomcat,及配置Tomcat属性介绍和优化下的建议;

雄哥的专栏 1万+

ROS Navigation global_planner框架解析

ROS Navigation global_planner框架解析主要讲一下我看源码总结的框架,如果大家跟着这个框架看源码的话可能会看的比较快。主要讲解global_planner关键配置参数含义及关键函数Astar,Dijkstra,QuadraticCalculator::calculatePotential,PotentialCalculator::calculatePotential,GridPath::getPath,GradientPath::getPath.

Jeff_Lee_的博客 4694

告别外置天线!手把手教你用HFSS仿真设计一个20x40mm的433MHz PCB蛇形天线

本文详细介绍了如何使用HFSS仿真工具设计一个20x40mm的433MHz PCB蛇形天线,解决物联网设备小型化中的天线集成难题。通过对比外置天线与PCB天线的性能差异,深入解析蛇形天线的电磁学原理,并提供从建模到优化的全流程实战指南,帮助工程师实现高效、低成本的微型化天线设计。

weixin_30606461的博客 431

4.【SpringBoot源码】SpringBoot内置Tomcat启动流程

SpringBoot 项目之所以部署简单,其很大一部分原因就是因为不用自己折腾 Tomcat 相关配置,因为其本身内置了各种 Servlet 容器。SpringBoot 是怎么通过简单运行一个 main 函数,就能将容器启动起来,并将自身部署到其上 ,接下来,我们就从源码的角度分析一下SpringBoot启动过程中Tomcat是如果自动启动的。SpringBoot内置Tomcat启动流程要从main函数入手,而main函数中的run()方法实际上是调用SpringApplication的run()方法。

weixiaohuai的博客 3254

PostgreSQL的学习心得和知识总结(八十二)|深入理解PostgreSQL数据库SQL语句的词法解析和语法解析流程

postgresql 词法解析语法解析流程

孤傲小二~阿沐的博客 5448

替换SpringBoot项目中的内嵌Tomcat为中创InforSuiteAS

最近接触到一个SpringBoot项目需要进行国产化,需要将Tomcat替换成国产的InforsuiteAS。之前听都没听过网上也找不到什么资料,换皮国产懂的都懂。替换挺简单的,但毕竟是冷门国产组件,还是踩了些坑,分享一下希望能帮到有需要的人。

weixin_45411299的博客 2968

手把手教你搭建工业级C#上位机:完整架构+通信+配置+日志,新手也能落地(附全套源码)

模型层是“数据容器”,统一数据格式,避免参数传递混乱。本文搭建的C#上位机,采用“分层+模块化”架构,解耦了UI、通信、配置、日志四大核心功能,不仅满足工业场景的基础需求,还为后续扩展打下基础。新手跟着步骤走,既能掌握上位机的核心开发技能,又能理解工业级项目的架构设计思路。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1154

CloudCompare二次开发(1)——获取指定高程的所有点

使用CloudCompare插件实现获取点云数据中指定高程的所有点。

点云侠的博客 4732

你还记得 Tomcat 的工作原理么

SpringBoot 就像一条巨蟒,慢慢缠绕着我们,使我们麻痹。不得不承认,使用了 SpringBoot 确实提高了工作效率,但同时也让我们遗忘了很多技能。刚入社会的时候,我还是通过 Tomcat 手动部署 JavaWeb 项目,还经常对 Tomcat 进行性能调优。除此之外,还需要自己理清楚各 Jar 之间的关系,以避免 Jar 丢失和各版本冲突导致服务启动异常的问题。到如今,这些繁琐而又重复的工作已经统统交给 SpringBoot 处理,我们可以把更多的精力放在业务逻辑上。但是,清楚 Tomcat 的工

ITDragon博客 573

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex&trade;-M4F 内核的信息,请参见《Cortex&trade;-M4F 技术参考手册》。

SpringBoot源码解析:自动配置与启动流程详解

自动配置是SpringBoot框架的核心特性之一,它通过条件注解和类路径扫描实现零配置快速启动。其底层原理基于Spring框架的BeanDefinition注册机制,结合META-INF/spring.factories文件实现组件自动发现。在工程实践中,这种机制大幅减少了样板代码,使得开发者只需引入对应starter依赖即可获得完整功能集成。通过分析SpringApplication初始化过程,可以深入理解Web应用类型推断、环境准备、上下文刷新等关键阶段。掌握这些原理不仅能优化应用启动速度,还能在面试和

weixin_30550081的博客 341

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Spring Boot框架总结(超级详细)

IOC容器填加相应依赖配置可以实现在自定义配置properties配置提示@ConfigurationProperties(prefix = "person")注解的作用是将配置文件中以person开头的属性值通过setXX()方法注入到实体类对应属性中。@Component注解的作用是将当前注入属性值的Person类对象作为Bean组件放到Spring容器中,只有这样才能被@ConfigurationProperties注解进行赋值。

tangjieqing的博客 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

SpringBoot的启动方式之SpringBootServletInitializer

SpringBoot的启动方式之SpringBootServletInitializer 第一天工作,看大佬写的源码的时候,突然发现在启动类下面还有一个类 public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {

xiaozhuzhuyang的博客 7806

tomcat8-架构分析

介绍 Tomcat 是由 Apache 开发的一个 Servlet 容器,实现了对Servlet 和 JSP 的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理。 Tomcat开源框架 属于Java语言编写web服务器 目录介绍 /bin:存放windows或Linux平台上启动和关闭Tomcat的脚本文件 /conf:存放Tomcat服务器的各种全局配置文件,其中最重要的是server.xml和web.xml /lib:存放Tomcat服务器以及所有web应用都可以

weixin_44044929的博客 766

如何断点调试Tomcat源码

如何断点调试Tomcat源码 Tomcat作为一个老牌的一个Web容器框架,用途十分的广泛。无论是为了学习其框架的整体设计还是为了碰到问题更好的解决,作为程序员我们都应该对于Tomcat有一定的了解。而了解一个框架最好的办法就是看官方文档,但是有时候官方文档解答不了我们的问题,这时候就需要看源码了。 无论是使用编译器Idea还是Eclipse,或者是内嵌Tomcat的SpringBoot,我们都无...

weixin_34253126的博客 1189

SpringBoot加载web项目流程源码解析

​上一篇文章中我们写了一个极简版的SpringBoot,基本完成了Controller的映射和访问,真实的SpringBoot是如何来做的?我们以2.3.0.RELEASE版本的SpringBoot为例来看下它是如何一步一步创建内嵌的tomcat并且注册DispatcherServlet的,它是否跟上篇文章中讲的一样,也是利用了Servlet3.0的ServletContainerInitializer和WebApplicationInitializer呢? 友情提示:公众号的排版对源码的文章非常不友好,建

若鱼的专栏 541
上一篇: 【LeetCode每日一题:1739. 放置盒子~~~找规律+数学公式推导】
下一篇: 【LeetCode每日一题:1759. 统计同构子字符串的数目~~~数学公式+双指针+动态规划】
硕风和炜
硕风和炜 优质创作者: Java技术领域 优质创作者: Java技术领域
博客等级 码龄7年 2万+粉丝 1024原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硕风和炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值