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

SpringBoot源码-SpringBoot内嵌Tomcat原理

一、什么是Tomcat?

Tomcat介绍:

Tomcat容器是一个开源的、轻量级的Java Web应用服务器,主要用于运行Java Servlet、JavaServer Pages(JSP)和Java Expression Language(EL)技术‌。以下是关于Tomcat容器的详细解释:
‌核心功能‌:Tomcat作为Servlet容器,负责处理客户端的HTTP请求,并将这些请求转化为服务器端的Java代码执行,最终生成HTTP响应返回给客户端。同时,它还支持JSP技术,允许开发者创建动态Web内容。
‌特点‌:Tomcat具有轻量级、多线程处理、配置灵活等特点。它可以在较低的硬件配置上运行,且能够同时处理多个客户端请求,提高服务器的并发性能。此外,Tomcat的配置非常灵活,可以根据具体的应用需求进行调优。
‌用途‌:Tomcat广泛用于部署和运行Java Web应用程序,这些应用程序通常打包成WAR文件并部署在Tomcat中运行‌。
综上所述,Tomcat容器是Java Web开发中的重要工具,为开发者提供了稳定、高效的运行环境。

Tomcat的架构图:
在这里插入图片描述

Bootstrap中的main方法:

bootstrap.init(); // 初始化类加载器
bootstrap.load(); // 间接调用Catalina,创建对象树,然后调用生命周期的init方法初始化整个对象树
bootstrap.start(); // 间接调用Catalina的start方法,然后调用生命周期的start方法启动整个对象树

二、SpringBoot中详解

spring-boot-autoconfigure\2.2.2.RELEASE\spring-boot-autoconfigure-2.2.2.RELEASE.jar!\META-INF\spring.factories这个自动装配的文件和注入了这两个和容器相关的类:
在这里插入图片描述
第一个是EmbeddedWebServerFactoryCustomizerAutoConfiguration
image.png
image.png
在这个配置类里面就是根据我们的配置来内嵌对应的Web容器,比如Tomcat或者Jetty等。
第二个是:ServletWebServerFactoryAutoConfiguration
首先来看下在类的头部引入和一些核心的信息
imagepng

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

imagepng

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

现在开始debug源码看下再什么时候完成的tomcat的创建以及启动流程。

SpringApplication的run(String… args)方法中:

// 刷新应用上下文 完成Spring容器的初始化
			refreshContext(context);

继续refreshContext:

	private void refreshContext(ConfigurableApplicationContext context) {
		refresh(context);
		if (this.registerShutdownHook) {
			try {
				context.registerShutdownHook();
			}
			catch (AccessControlException ex) {
				// Not allowed in some environments.
			}
		}
	}

继续refresh(context);

	/**
	 * Refresh the underlying {@link ApplicationContext}.
	 * @param applicationContext the application context to refresh
	 */
	protected void refresh(ApplicationContext applicationContext) {
		Assert.isInstanceOf(AbstractApplicationContext.class, applicationContext);
		((AbstractApplicationContext) applicationContext).refresh();
	}

跳转到ServletWebServerApplicationContext的refresh方法:

	public final void refresh() throws BeansException, IllegalStateException {
		try {
			super.refresh();
		}
		catch (RuntimeException ex) {
			stopAndReleaseWebServer();
			throw ex;
		}
	}

AbstractApplicationContext的refresh()找到onRefresh():
跳转到ServletWebServerApplicationContext的onRefresh:
开始创建webServer:

	protected void onRefresh() {
		super.onRefresh();
		try {
			createWebServer();
		}
		catch (Throwable ex) {
			throw new ApplicationContextException("Unable to start web server", ex);
		}
	}

createWebServer方法如下:

	private void createWebServer() {
		WebServer webServer = this.webServer;
		ServletContext servletContext = getServletContext();
		if (webServer == null && servletContext == null) {
			ServletWebServerFactory factory = getWebServerFactory(); // 获取WebServer的工厂对象
			this.webServer = factory.getWebServer(getSelfInitializer()); // 获取具体的WebServer
		}
		else if (servletContext != null) {
			try {
				getSelfInitializer().onStartup(servletContext);
			}
			catch (ServletException ex) {
				throw new ApplicationContextException("Cannot initialize servlet context", ex);
			}
		}
		initPropertySources();
	}

factory.getWebServer(getSelfInitializer()); // 获取具体的WebServer如下:
factory是TomcatServletWebServerFactory和上面对应上了
在这里插入图片描述
可以看到,从容器中获取的工厂对象其实就我们上面注入的对象,然后根据工厂对象获取到了一个TomcatWebServer实例,也就是Tomcat服务对象。关键点我们需要看下getWebServer方法的逻辑

imagepng

imagepng

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

imagepng

进入构造方法查看

imagepng

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

imagepng

进入start方法

imagepng

imagepng

到这儿后面的逻辑其实就是Tomcat自身启动的逻辑了。这就需要你的Tomcat基础了,到这SpringBoot启动是如何内嵌Tomcat容器的到这儿就结束了哦。


http://www.kler.cn/a/416649.html

相关文章:

  • Java 响应式编程 Lambda、Funcation、Stream 知识要点总结
  • 前端框架Vue3项目实战(基于Vue3实现一个小相册)
  • SpringBoot开发——Spring Boot中实现订单30分钟自动取消的策略
  • Socket编程(TCP/UDP详解)
  • Ubuntu-20.04安装 terminator
  • 格网法计算平面点云面积(matlab版本)
  • 科研小白成长记41——享受大起大落
  • 【真正离线安装】Adobe Flash Player 32.0.0.156 插件离线安装包下载(无需联网安装)
  • c++学习——list容器的使用学习
  • 【C++】LeetCode:LCR 077. 排序链表
  • YOLO系列论文综述(从YOLOv1到YOLOv11)【第13篇:YOLOv10——实时端到端物体检测】
  • Vue.js 实现用户注册功能
  • Python 小高考篇(8)拓展
  • 拥抱 OpenTelemetry:阿里云 Java Agent 演进实践
  • leetcode 797.所有的可能的路径
  • 【docker】docker build上下文
  • map用于leetcode
  • 【HTML】关于列表标签和表格标签
  • 计算机毕业设计Python+卷积神经网络股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI
  • UCOS-II 自学笔记
  • 性能测试生产环境只读业务压力测试及容量评估
  • elasticsearch现有集群扩展节点
  • 随着新技术和产业政策的双轮驱动,未来中国【电子氟化液】市场将迎来发展机遇
  • 【Python数据分析】房价预测:使用线性回归模型预测波士顿房价
  • 《白帽子讲Web安全》15-16章
  • 渐冻症:在困境中寻找希望之光