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

【Spring Boot】配置嵌入式Servlet容器及启动原理 SpringBoot配置嵌入式Servlet容器定制和修改Servlet容器相关配置全局配置文件编写WebServerFactoryCustomizer注册Servlet三大组件注册Servlet注册Filter注册ListenerSpringBoot注册DispatcherServlet切换嵌入式Servlet容器 SpringBoot默认使用Tomcat作为嵌入式的Servlet容器 定制和修改Servlet容器相关配置 可以通过全局配置文件或者自己编写WebServerFactoryCustomiz 阅读详情

嵌入式servlet容器启动原理

本文承接上一篇文章《SpringBoot系列之嵌入式servlet容器自动配置原理》,建议结合阅读,并结合源码深入理解。

本文将探讨以下问题:
什么时候创建嵌入式的Servlet容器工厂?什么时候获取嵌入式的Servlet容器并启动Tomcat;


1)、SpringBoot应用启动运行run方法
2)、refreshContext(context);SpringBoot刷新IOC容器【创建IOC容器对象,并初始化容器,创建容器中的每一
个组件】;如果是web应用创建:AnnotationConfigEmbeddedWebApplicationContext,否则创建:AnnotationConfigApplicationContext

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);
		// 创建IOC容器,如果是web应用创建AnnotationConfigEmbeddedWebApplicationContext
		// 否则创建AnnotationConfigApplicationContext
		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);
	}
}

3)、refresh(context);刷新刚才创建好的ioc容器;

public void refresh() throws BeansException, IllegalStateException {
    synchronized (this.startupShutdownMonitor) {
        // Prepare this context for refreshing.
        prepareRefresh();
        // Tell the subclass to refresh the internal bean factory.
        ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
        // Prepare the bean factory for use in this context.
        prepareBeanFactory(beanFactory);
        try {
            // Allows post-processing of the bean factory in context subclasses.
            postProcessBeanFactory(beanFactory);
            // Invoke factory processors registered as beans in the context.
            invokeBeanFactoryPostProcessors(beanFactory);
            // Register bean processors that intercept bean creation.
            registerBeanPostProcessors(beanFactory);
            // Initialize message source for this context.
            initMessageSource();
            // Initialize event multicaster for this context.
            initApplicationEventMulticaster();

            // SpringBoot web的ioc容器重写了onRefresh方法.
            onRefresh();
            // Check for listener beans and register them.
            registerListeners();
            // Instantiate all remaining (non-lazy-init) singletons.
            finishBeanFactoryInitialization(beanFactory);

            // Last step: publish corresponding event.
            finishRefresh();
        } catch (BeansException ex) {
           // 源码省略 ...                
        } 
    }
}

4)、onRefresh(); web的ioc容器重写了onRefresh方法
5)、webIOC容器会创建嵌入式的Servlet容器;createEmbeddedServletContainer();
6)、获取嵌入式的Servlet容器工厂:
    EmbeddedServletContainerFactory containerFactory = getEmbeddedServletContainerFactory();
从ioc容器中获取EmbeddedServletContainerFactory 组件;TomcatEmbeddedServletContainerFactory创建
对象,后置处理器一看是这个对象,就获取所有的定制器来先定制Servlet容器的相关配置;(注:参考《SpringBoot系列之嵌入式servlet容器自动配置原理》)
7)、使用容器工厂获取嵌入式的Servlet容器:
    this.embeddedServletContainer = containerFactory.getEmbeddedServletContainer(getSelfInitializer());
8)、嵌入式的Servlet容器创建对象并启动Servlet容器;
    先启动嵌入式的Servlet容器,再将IOC容器中剩下没有创建出的对象获取出来;IOC容器启动创建嵌入式的Servlet容器

 

嵌入式的Servlet容器在企业级应用中可能存在一定的局限性,使用嵌入式Servlet容器:应用需打成可执行的jar
优点:简单、便携;
缺点:默认不支持JSP、
    优化定制比较复杂(使用定制器【ServerProperties、自定义EmbeddedServletContainerCustomizer】,自己编写嵌入式Servlet容器的创建工厂【EmbeddedServletContainerFactory】);

在大部分的企业应用中我们可能将项目打成war包,容器的一些参数配置到外置容器上,接下来的文章将探讨《外部Servlet容器启动SpringBoot应用》

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

相关推荐

Java实战:绿盾加密文件批量解密工具Ldterm的实现与优化

本文详细介绍了基于Java开发的绿盾加密文件批量解密工具Ldterm的实现与优化过程。通过分析绿盾加密机制,结合Java流处理能力,实现了高效的文件解密方案,并分享了多线程处理、内存优化等性能提升技巧,适用于企业级数据迁移与备份场景。

weixin_29314405的博客 492

如何在SpringBoot中使用Servlet

SpringBoot中使用Servlet一、注解方式1.1、创建SpringBoot Web工程1.2、创建Servlet类并添加@WebServlet注解1.3、在引导类上添加@ServletComponentScan注解测试:二、配置类方式2.1、创建SpringBoot工程2.2、创建Servlet类2.3、创建Servlet配置类测试: 一、注解方式 1.1、创建SpringBoot Web工程 1.2、创建Servlet类并添加@WebServlet注解 继承HttpServlet类并且重写d

zt的博客 2830

5.1 Tessent Atpg系列 第八章 Test Pattern Generation - Verify Test Pattern

为什么要做基于timing的仿真,意义在于可以比较ATPG工具和simulator工具的差异性。因为时序的差异导致不同的结果。首先你需要通过write_patern 这句cmd来写出pattern,默认是parallel 模式,除非你用-serial 指定写出serial, 因为serial 文件非常大,所以你可以使用-sample 开关写出部分pattern即可,工具会根据每一种pattern 类型都会至少保存一只。 另外,你也可以使用-start -end 开关来减少文件大小,但是这样的截取,是不可靠的

ciscomonkey的博客 7763

嵌入式servlet容器原理解析

web容器的创建依赖于用户导入了什么jar包,根据用户导入的场景jar,ServletWebServerFactoryConfiguration 配置类就会依托条件注解帮助创建具体的servlet容器的工厂,通过工厂获取到具体的servlet容器。○ ServletWebServerApplicationContext 启动的时候寻找 ServletWebServerFactory(Servlet 的web服务器工厂—> Servlet 的web服务器)○ 底层直接会有一个自动配置类。

zhonghuan5281852的博客 349

TP-LINK电信定制摄像头刷机教程:解锁官方功能与固件升级

固件是嵌入式设备的操作系统,控制着硬件的基础功能。其工作原理是通过更新或替换存储在设备非易失性存储器中的程序代码,从而改变设备的行为和功能。这项技术的核心价值在于赋予用户对设备的完全控制权,能够解除厂商或运营商的软件限制,实现功能自定义、性能优化和安全更新。在智能家居、网络设备和物联网领域,固件升级与刷机是常见的工程实践,用于修复漏洞、增加新特性或适配不同平台。本文聚焦于利用TFTP恢复模式这一通用网络设备维护机制,针对TP-LINK电信定制版摄像头,提供一套完整的刷机方案,将设备刷入官方通用版固件,以解除

weixin_34205826的博客 494

SpringBoot——嵌入式 Servlet容器_servlet 容器怎么配置

由于SpringBoot默认是以 jar包的方式启动嵌入的Servlet容器来启动SpringBoot的web应用,没有web.xml文件。注册三大组件的方式如下:【1】通过注册自定义的Servlet。【2】通过 FilterRegistrationBean 注册拦截器 Filter。

2401_85015500的博客 1119

基于STM32L4XX、HAL库的ICM-42670-P姿态传感器驱动程序设计

sprintf(buffer, "温度: %.1f °C\r\n\r\n", sensor_data.temperature);sprintf(buffer, "陀螺仪: X=%.2f Y=%.2f Z=%.2f rad/s\r\n",sprintf(buffer, "加速度: X=%.2f Y=%.2f Z=%.2f m/s²\r\n",sprintf(buffer, "开始校准IMU,请保持传感器静止...\r\n");sprintf(buffer, "读取传感器数据失败\r\n");

zhusl6688的博客 642

springboot如何启动servlet

springboot是如何加载servlet的

Lonely_Devil的博客 1087

久坐不慌,健康护航 —— 智能震动提醒坐垫的设计与实现

硬件核心:选用 ESP32 为主控,HX711 + 应变片实现精准压力检测,8050 三极管驱动震动马达,锂电池 + TP4056 满足便携供电需求;软件逻辑:核心是 “压力阈值判断 + 时间计时”,达到久坐阈值后触发震动提醒,流程图清晰体现了循环检测、状态重置的核心逻辑;代码特性:代码注释完善,阈值可灵活调整,支持串口调试,新手可直接编译烧录并根据实际场景校准。

weixin_42300449的博客 401

【硬件工程师面经整理18_Smith圆图】

若文中任何内容侵犯了您的合法权益,请相关权益人及时与我联系,我将立即进行核实并采取适当措施,包括但不限于删除相关内容或更新文章以消除影响。**在Smith圆图上,源阻抗表示为圆心,而负载阻抗表示为圆图上的一个点。具体来说,通过将负载阻抗在Smith圆图上移动到特定位置,使其与传输线特性阻抗形成纯电阻或纯电抗的组合,从而实现匹配。例如,反射系数表示为Smith圆图上的一个点,而驻波比则表示为圆图上两个点之间的距离。Smith圆图是用于阻抗匹配和网络分析的工具,它是一种将复阻抗表示为坐标的图形。

LeeYLong的博客 652

SpringBoot——嵌入式 Servlet容器

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

程序猿进阶 3581

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

pshdhx的博客 4939

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

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

cd546566850的博客 1505

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

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

【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

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容器

一、配置嵌入式Servlet容器 SpringBoot默认使用Tomcat作为嵌入式的Servlet容器; 1、定制和修改Servlet容器的相关配置 (1)、修改和server有关的配置(ServerProperties【也是EmbeddedServletContainerCustomizer】)。 server.port=8081 server.context-path=/crud ser...

苍穹尘的博客 943

五、嵌入式Servlet容器启动原理

什么时候创建嵌入式Servlet容器工厂?什么时候获取嵌入式的Servlet容器并启动Tomcat? 获取嵌入式的Servlet容器工厂 1:SpringBoot应用启动run方法 2:refreshContext(context);SpringBoot刷新IOC容器,初始化IOC容器 此时需要进行一个判断:如果是web应用则创建 AnnotationConfigEmbeddedWebApplic...

发现问题,面对问题,分析问题,解决问题,总结问题 1322

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

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

如不來的博客 1114

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容器

SpringBoot_配置嵌入式Servlet容器

底层码农 6643

SpringBoot嵌入式Servlet容器启动原理

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

hq.zheng的博客 362

SpringBoot--嵌入式Servlet容器启动原理

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

吴声子夜歌的博客 261
上一篇: SpringBoot系列之嵌入式servlet容器自动配置原理
下一篇: SpringBoot系列之外部Servlet容器使用及配置
南哥220
博客等级 码龄9年 2粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值