SpringBoot系列之外部Servlet容器启动原理

SpringBoot——嵌入式 Servlet容器_servlet 容器怎么配置 【3】通过注册自定义的Listener。 阅读详情

外部Servlet容器启动springboot应用原理

了解外部Servlet容器启动springboot的原理,需要先了解一个规则,这个规则可以参考servlet3.0规范的8.2.4章 Shared libraries / runtimes pluggability:

本文摘录几条主要规则:
1)、服务器启动(web应用启动)会创建当前web应用里面每一个jar包里面ServletContainerInitializer实例:
2)、ServletContainerInitializer的实现放在jar包的META-INF/services文件夹下,有一个名为
javax.servlet.ServletContainerInitializer的文件,内容就是ServletContainerInitializer的实现类的全类名
3)、还可以使用@HandlesTypes,在应用启动的时候加载我们感兴趣的类;

这些规则有助于理解接下来讨论的springboot流程:
1)、启动Tomcat
2)、org\springframework\spring-web\4.3.14.RELEASE\spring-web-4.3.14.RELEASE.jar!\METAINF\services\javax.servlet.ServletContainerInitializer:
Spring的web模块里面有这个文件:org.springframework.web.SpringServletContainerInitializer
3)、SpringServletContainerInitializer将@HandlesTypes(WebApplicationInitializer.class)标注的所有这个类型
的类都传入到onStartup方法的Set;为这些WebApplicationInitializer类型的类创建实例;

注:上一篇文章说的使用外部容器启动需要编写一个SpringBootServletInitializer的子类,通过继承树可以看到就是WebApplicationInitializer的子类
4)、每一个WebApplicationInitializer都调用自己的onStartup;
5)、相当于我们的SpringBootServletInitializer的类会被创建对象,并执行onStartup方法

6)、SpringBootServletInitializer实例执行onStartup的时候会createRootApplicationContext;创建容器

protected WebApplicationContext createRootApplicationContext(
		ServletContext servletContext) {
	// 创建SpringApplicationBuilder
	SpringApplicationBuilder builder = createSpringApplicationBuilder();
	// 配置环境
	StandardServletEnvironment environment = new StandardServletEnvironment();
	environment.initPropertySources(servletContext, null);
	builder.environment(environment);
	// 设置主类
	builder.main(getClass());
	ApplicationContext parent = getExistingRootWebApplicationContext(servletContext);
	if (parent != null) {
		this.logger.info("Root context already created (using as parent).");
		servletContext.setAttribute(
				WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, null);
		builder.initializers(new ParentContextApplicationContextInitializer(parent));
	}
	builder.initializers(
			new ServletContextApplicationContextInitializer(servletContext));
	builder.contextClass(AnnotationConfigEmbeddedWebApplicationContext.class);
	// 调用configure方法,子类重写了这个方法,将SpringBoot的主程序类传入了进来
	builder = configure(builder);
	// 使用builder创建一个Spring应用
	SpringApplication application = builder.build();
	if (application.getSources().isEmpty() && AnnotationUtils
			.findAnnotation(getClass(), Configuration.class) != null) {
		application.getSources().add(getClass());
	}
	Assert.state(!application.getSources().isEmpty(),
			"No SpringApplication sources have been defined. Either override the "
					+ "configure method or add an @Configuration annotation");
	// Ensure error pages are registered
	if (this.registerErrorPageFilter) {
		application.getSources().add(ErrorPageFilterConfiguration.class);
	}
	// 启动Spring应用
	return run(application);
}

7)、Spring的应用就启动并且创建IOC容器

public ConfigurableApplicationContext run(String... args) {
	StopWatch stopWatch = new StopWatch();
	stopWatch.start();
	ConfigurableApplicationContext context = null;
	FailureAnalyzers analyzers = null;
	configureHeadlessProperty();
	SpringApplicationRunListeners listeners = getRunListeners(args);
	listeners.starting();
	try {
		ApplicationArguments applicationArguments = new DefaultApplicationArguments(
				args);
		ConfigurableEnvironment environment = prepareEnvironment(listeners,
				applicationArguments);
		Banner printedBanner = printBanner(environment);
		context = createApplicationContext();
		analyzers = new FailureAnalyzers(context);
		prepareContext(context, environment, listeners, applicationArguments,
				printedBanner);
		// 刷新IOC容器
		refreshContext(context);
		afterRefresh(context, applicationArguments);
		listeners.finished(context, null);
		stopWatch.stop();
		if (this.logStartupInfo) {
			new StartupInfoLogger(this.mainApplicationClass)
					.logStarted(getApplicationLog(), stopWatch);
		}
		return context;
	} catch (Throwable ex) {
		handleRunFailure(context, listeners, analyzers, ex);
		throw new IllegalStateException(ex);
	}
}

综上,整个过程就是启动Servlet容器,再启动SpringBoot应用

本文可简述如下:

1.创建SpringBootServletInitializer的子类并重写configure方法
2.configure方法中SpringApplicationBuilder传入SpringBootApplication主程序类
    – builder.source(@SpringBootApplication类)
3.启动原理
    – Servlet3.0标准ServletContainerInitializer扫描所有jar包中METAINF/services/javax.servlet.ServletContainerInitializer文件指定的类并加载
    – 加载spring web包下的SpringServletContainerInitializer
    – 扫描@HandleType(WebApplicationInitializer)
    – 加载SpringBootServletInitializer并运行onStartup方法
    – 加载@SpringBootApplication主类,启动容器等

SpringBoot源码学习系列之嵌入式Servlet容器 SpringBoot源码学习系列之嵌入式Servlet容器启动原理 SpringBoot的自动配置就是SpringBoot的精髓所在,对于SpringBoot具体实现不是很清楚的读者,可以读取我的源码学习专栏,里面有对SpringBoot的源码进行学习的一些博客,内容比较简单,比较适合入门学习 对于SpringBoot项目是不需要配置Tomcat、jetty等等Servlet容器,直接启动appl... 阅读详情

相关推荐

MC33PT2000控制详解一:PT2000 Dev Studio工具的使用

MC33PT2000共可控制6个高低端(如控制6个高压喷油器),1个高低端(如控制高压油泵)和DC-DC模块(如升压到65V).

m0_69929716的博客 1355

spring boot容器启动详解

spring cloud大行其道的当下,如果不了解基本原理那么是很纠结的(看见的都是约定大于配置,但是原理呢?为什么要这么做?如何串联起来的?spring cloud是基于spring boot快速搭建的,今天咱们就看看spring boot容器启动流程(全文基于1.5.9版本,springboot2基本一致)。(本文不讲解如何快速启动spring boot,那些直接官方看即可,官网文档飞机票回到顶部按照前面的分析,Spring-boot容器启动流程总体可划分为2部分:1)执行注解。

CHIKA2333的博客 1200

RFSOC实战解析(一):深入RF Data Converter的时钟与数据接口设计

本文深入解析RFSOC中RF Data Converter的时钟与数据接口设计,涵盖GHz采样、数据流处理、时钟树同步及AXI-Stream接口实战。通过详细案例和调试技巧,帮助工程师高效配置IP核,优化ADC/DAC性能,解决跨时钟域和信号完整性等关键问题。

weixin_30955617的博客 473

springboot 启动流程(一) 借助外部容器启动

对springboot项目,可以通过两种方式启动服务,一是利用内嵌的Tomcat作为web容器启动,两一种方式是借助外部容器启动。本章先介绍通过外部容器启动的源码流程。 一、springboot 借助外部容器 @EnableSwagger2 @SpringBootApplication public class Application extends SpringBootServletIni...

西木风落 1362

BIM Revit教程(六)尝试安装 Revit 时显示“Autodesk Revit 已安装。”

在安装Revit或RevitLT时,若系统提示“AutodeskRevit版本已安装”,通常是由于旧版本残留文件未完全清除所致。解决方案包括:1.通过控制面板或Windows设置卸载旧版本Revit,确保所有相关组件被移除;2.使用Autodesk卸载工具(AdskUninstallHelper)进一步清理;3.谨慎操作注册表,删除与Revit相关的残留项;4.确保系统有至少30GB的可用磁盘空间;5.完成上述步骤后,重新尝试安装Revit。此外,文章还提到了一个免费功能商店,供用户寻找提效工具,并鼓励粉丝

ZOZO_888的博客 2129

从零构建简历智能匹配系统:AI技术助力高效招聘

本文详细介绍了简历智能匹配系统的开发过程,从数据收集、预处理、特征提取到模型匹配和结果展示,每一步都提供了详细的代码实例。通过使用TF-IDF、Word2Vec和BERT等技术,我们能够有效地将求职者的简历与职位描述进行匹配,从而提高招聘效率。未来,随着自然语言处理技术的进一步发展,简历智能匹配系统将变得更加智能和高效,为企业和求职者提供更好的服务。

理论都是虚的,代码才是王道。 309

SpringBoot的两种启动方式原理

使用java -jar默认情况下,不会启动任何嵌入式Application Server,该命令只是启动一个执行jar main的JVM进程,当spring-boot-starter-web包含嵌入式tomcat服务器依赖项时,执行java -jar则会启动Application Server。注意:使用内置tomcat不需要有tomcat-embed-jasper和spring-boot-starter-tomcat依赖,因为在spring-boot-starter-web依赖中已经集成了tomcat。

SevenCoding的博客 1972

Rerender A Video 技术浅析(四):跨帧约束

时间一致性是指在视频处理过程中,保持相邻帧之间内容、风格和运动的平滑过渡,避免出现视觉上的不连续性或伪影。时间一致性跨帧约束模块的主要目标是在视频增强、风格迁移等任务中,确保处理后的视频在时间维度上保持一致性和稳定性。该模块主要通过以下几种方式实现时间一致性:1.时序损失(Temporal Loss):最小化相邻帧之间的差异,确保帧间内容的平滑过渡。2.循环一致性损失(Cycle Consistency Loss):确保帧间转换的一致性,避免出现风格漂移。3.

m0_75253143的博客 1480

spring-boot启动源码 servlet spring-boot 内嵌tomcat 外置tomcat

spring-boot启动源码 servlet spring-boot 内嵌tomcat 外置tomcat

m0_64639742的博客 1413

概念解析 | 事件相机的原理 (含仿真代码)

在我们熟悉的世界里,传统相机就像一个勤勉的绘画师,每隔固定的时间就为我们勾勒出一幅完整的画面。但是,大自然中有太多瞬息万变的精彩场景,这种"定时绘画"的方式往往难以捕捉。于是,一种全新的"观察者"应运而生 -事件相机(Event Camera)。事件相机,就像是一群极其敏感的"像素哨兵",它们不再按部就班地等待指令,而是主动感知周围的变化,只有在光线强度发生显著变化时才会发出信号。这种革命性的设计,让事件相机拥有了传统相机难以企及的优势:超高的时间分辨率、极低的延迟、宽广的动态范围,以及出色的能效比。

NLOS的博客 1422

NX二次开发PK获取对象类型

PK_ENTITY_ask_class(),获取对象类型建议用这个函数,比较通用,包含所有对象类型,可以替代UF_MODL_ask_edge_type(),UF_MODL_ask_body_type(),UF_MODL_ask_face_type()等函数。

qq_39541524的博客 827

使用外部容器运行spring-boot项目:不使用spring-boot内置容器让spring-boot项目运行在外部tomcat容器中

外部容器运行spring-boot项目,只需要在原项目上做两件事。

iijik55的博客 525

CMake教程:C++ CMake自定义find_package并在其它项目使用

find_package 是 CMake 中一个非常重要的命令,用于在系统中找到外部库或包,并将其包含到项目中。: 要查找的包的名称。[version]: 可选的版本号。如果指定了版本号,CMake 会尝试找到该版本或更高版本的包。[REQUIRED]: 如果指定了这个关键字,找不到包时会产生一个错误并终止配置过程。: 指定要查找的包的组件。: 指定可选的组件,即使找不到这些组件,配置过程也会继续。: 指定查找包的模式,CONFIG表示查找配置文件,MODULE表示查找模块文件。

琅嬛福地 1563

SpringBoot——嵌入式 Servlet容器

前言: 在环境下,默认使用的是作为嵌入式的容器;【1】修改和相关的配置(实现了)例如:修改端口号 ☞ 我们也可以进入所属的对象中,发现其他可修改的参数等等,如下: 【2】编写一个:嵌入式的 Servlet容器的定制器,来修改 Servlet容器的配置。其实1中的 ServerProperties也是实现了 EmbeddedServletContainerCustomizer。xxxCustomizer 帮组我们进行定制配置。 二、注册Servlet三大组件【Servlet、Filter、Listener】

程序猿进阶 3581

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SpringBoot——外置Servlet容器启动SpringBoot应用的原理

一、内置Servlet容器和外置Servlet容器的对比   内置:将应用打成jar包,项目启动时执行SpringBoot主配置类的main方法,启动IOC容器,创建嵌入式的Servlet容器并启动   外置:将应用打成war包,先启动外置的Servlet服务器(如tomcat),通过外置的服务器启动SpringBoot应用(将SpringBoot应用的主配置类作为参数传入SpringBootSe...

如不來的博客 1114

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SpringBoot系列之外部Servlet容器使用及配置

外部Servlet容器使用及配置 上一篇文章介绍了嵌入式的servlet容器配置及启动原理 本文将介绍使用外部servlet容器启动SpringBoot应用的方法及其启动原理。 笔者不太会使用大量的文字描述某些问题,所以文章会更多的出现SpringBoot的源码,通过对源码的注释来向读者描述相关的内容,建议读者使用电脑结合代码进行阅读 使用外置的Servlet容器:外面安装Tomcat---...

南哥的博客 562

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

springboot的servlet容器配置及原理

一、嵌入式servlet容器 1.配置 springboot默认使用tomcat来作为嵌入式的servlet容器。 1) 定制和修改servlet容器的配置 ① 修改application.properties文件中和servlet有关的配置(对应org.springframework.boot.autoconfigure.web.ServerProperties【实现了EmbeddedServletContainerCustomizer接口】) server.port=8081 server.

shyc126的专栏 1577

springboot嵌入式servlet容器启动原理(二)

###5)、嵌入式Servlet容器启动原理; 什么时候创建嵌入式的Servlet容器工厂?什么时候获取嵌入式的Servlet容器并启动Tomcat; 获取嵌入式的Servlet容器工厂: 1)、SpringBoot应用启动运行run方法 2)、refreshContext(context);SpringBoot刷新IOC容器【创建IOC容器对象,并初始化容器,创建容器中的每一个组件】;如果是web应用创建AnnotationConfigEmbeddedWebApplicationContext,否

pshdhx的博客 4939

SpringBoot 2.x 版本 嵌入式Servlet容器自动配置原理以及启动原理(超详细)

一、版本说明: Spring Boot 2.x 版本的嵌入式Servlet容器自动配置是通过WebServerFactoryCustomizer定制器 来定制的,而在Spring Boot 1.x 版本中我们是通过EmbeddedServletContainerCustomizer嵌入式的Servlet容器定制器来定制的。由于之前看的资料都是1.x的版本,但是我使用的是2.x,所以在这里记...

cd546566850的博客 1505

SpringBoot系列之嵌入式servlet容器启动原理

嵌入式servlet容器启动原理 本文承接上一篇文章《SpringBoot系列之嵌入式servlet容器自动配置原理》,建议结合阅读,并结合源码深入理解。 本文将探讨以下问题: 什么时候创建嵌入式的Servlet容器工厂?什么时候获取嵌入式的Servlet容器并启动Tomcat; 1)、SpringBoot应用启动运行run方法 2)、refreshContext(context);Spr...

南哥的博客 821

SpringBoot外部Servlet容器启动原理

一、原理: jar包:执行SpringBoot主类的main方法,启动ioc容器,创建嵌入式的Servlet容器;(内嵌Servlet容器) war包:启动服务器,服务器启动SpringBoot应用【SpringBootServletInitializer】,启动ioc容器;(外部Servlet容器) 二、外部Servlet容器启动规则: 1)、服务器启动(web应用启动)会创建当前web...

hq.zheng的博客 625

SpringBoot源码学习之路(十一、嵌入式Servlet容器的配置、切换和启动原理 )

嵌入式Servlet容器 SpringBoot默认使用Tomcat作为嵌入式的Servlet容器 一、如何定制和修改Servlet容器的相关配置? 方式1、修改和server有关的配置(ServerProperties【也是EmbeddedServletContainerCustomizer】); #通用的Servlet容器设置 #server.xxx #Tomcat的设置 #serv...

.... 永远年轻,永远热泪盈眶 6445

SpringBoot——嵌入式Servlet容器自动配置原理以及启动原理

0 嵌入式Servlet容器自动配置原理以及启动原理的步骤 1 嵌入式Servlet容器自动配置原理(以Tomcat为例) 1.1 简单介绍 2 嵌入式Servlet容器启动原理(以Tomcat为例) 2.1 SpringBoot启动时,启动Tomcat的原理 2.2 嵌入式的Servlet容器工厂创建tomcat容器,初始化并启动容器 2.2.1 嵌入式Servlet容器工厂的自动配置类 1> 注册后置处理器(WebServerFactoryCustomizerBeanPostPro..

weixin_44730681的博客 1082

【springboot源码】嵌入式Servlet容器底层原理分析

【springboot源码】嵌入式Servlet容器底层原理分析1.springboot嵌入式Servlet容器基础使用1.1 SpringBoot定制和修改Servlet容器的相关配置1.2 springboot注册Servlet三大组件【Servlet、Filter、Listener】方法2.springboot嵌入式Servlet容器自动配置原理3.springboot嵌入式Servlet容...

aaa_bbb_ccc_123_456的博客 1382

Spring Boot 之 Servlet容器 配置和启动流程

Spring Boot 之 Servlet 容器配置和启动流程。

bluemysky的博客 2552
上一篇: SpringBoot系列之外部Servlet容器使用及配置
下一篇: Spring Boot系列之Docker快速上手
南哥220
博客等级 码龄9年 2粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值