Spring boot之ServletContextInitializer

内置容器源码解析:DispatcherServlet加载过程 DispatcherServlet的加载过程 DispatcherServlet 的获取 还 记 得 在 上 一 章 Web应 用 中 自 动 配 置 的 DispatcherServlet 和 DispatcherServletRegistra-tionBean 吗?当时只是将其实例化了,并未做其他处理。而在上节 WebServer 初始化的过程中又加载了它们。下面我们进行相关源码的解析。 在 ServletWebServerApplicationContext#createWebServer 方 阅读详情

Spring Boot提供的在Servlet 3.0+环境中用于程序化配置ServletContext的接口。该接口 ServletContextInitializer主要被RegistrationBean实现用于往ServletContext容器中注册Servlet,Filter或者EventListener。这样设计的目的主要是旨在降低用于在war包中第三方库可能破坏spring boot 应用的风险,同时也方便spring容器管理这些beans。这些ServletContextInitializer实例不会被SpringServletContainerInitializer检测,因此不会被Servlet容器自动启动。


该接口ServletContextInitializer和Spring Web的另外一个接口WebApplicationInitializer看起来几乎一模一样,但二者使用目的不同。Spring Web中,WebApplicationInitializer也是针对Servlet 3.0+环境,设计用于程序化配置ServletContext,跟传统的web.xml对等或者配合使用。WebApplicationInitializer实现类会被SpringServletContainerInitializer自动检测和启动 (从servlet3.0开始,web容器启动时为提供给第三方组件机会做一些初始化的工作,例如注册servlet或者filtes等,servlet规范中通过ServletContainerInitializer实现此功能。每个框架要使用ServletContainerInitializer就必须在对应的jar包的META-INF/services 目录创建一个名为javax.servlet.ServletContainerInitializer的文件,文件内容指定具体的ServletContainerInitializer实现类,那么,当web容器启动时就会运行这个初始化器做一些组件内的初始化工作,具体可以参考servlet3规范)


ServletContextInitializer类结构如下:
ServletContextInitializer类
1、ServletListenerRegistrationBean 类似 ServletListener
2、ServletRegistrationBean 类似Servlet
3、FilterRegistrationBean 类似Filter


ServletContextInitializer 应用 – DispatcherServlet

package org.springframework.boot.autoconfigure.web.servlet;

import java.util.Collection;

import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.util.Assert;
import org.springframework.web.servlet.DispatcherServlet;

/**
 * {@link ServletRegistrationBean} for the auto-configured {@link DispatcherServlet}. Both
 * registers the servlet and exposes {@link DispatcherServletPath} information.
 *
 * @author Phillip Webb
 * @since 2.0.4
 */
public class DispatcherServletRegistrationBean extends ServletRegistrationBean<DispatcherServlet>
		implements DispatcherServletPath {

	private final String path;

	/**
	 * Create a new {@link DispatcherServletRegistrationBean} instance for the given
	 * servlet and path.
	 * @param servlet the dispatcher servlet
	 * @param path the dispatcher servlet path
	 */
	public DispatcherServletRegistrationBean(DispatcherServlet servlet, String path) {
		super(servlet);
		Assert.notNull(path, "Path must not be null");
		this.path = path;
		super.addUrlMappings(getServletUrlMapping());
	}

	@Override
	public String getPath() {
		return this.path;
	}

	@Override
	public void setUrlMappings(Collection<String> urlMappings) {
		throw new UnsupportedOperationException("URL Mapping cannot be changed on a DispatcherServlet registration");
	}

	@Override
	public void addUrlMappings(String... urlMappings) {
		throw new UnsupportedOperationException("URL Mapping cannot be changed on a DispatcherServlet registration");
	}

}
Spring Boot如何启动嵌入式Tomcat?(1) getWebServer会调用ServletContextInitializer#onStartup,即若想在Servlet容器启动时做一些事情,比如注册自己的Servlet,可以实现一个ServletContextInitializer,在Web容器启动时,Spring Boot会把所有实现ServletContextInitializer接口的类收集起来,统一调其onStartup。 阅读详情

相关推荐

全球半导体设备氧化钇熔射服务行业规模预测:预计未来六年CAGR为7.8%

本文将对“半导体设备氧化钇熔射服务”行业进行深度分析,探讨市场趋势的演变、核心竞争者的战略布局、供应链结构的内外特点、研发创新的最新进展、法规政策环境的适应性调整以及投资机会与风险评估。这一稳健的增长趋势表明半导体设备氧化钇熔射服务在电子行业中的重要性逐渐增强。由于全球对于高效、高精度和可靠的电子解决方案的需求增加,对能够提供这些功能的半导体设备氧化钇熔射服务的需求日益增长。由于半导体设备氧化钇熔射服务主要为就地服务型,其“配送”主要依赖于专业团队和技术设备的及时调配,强调服务的时效性和高质量。

CC1239777的博客 541

SpringBoot - 浅析 ServletContextInitializer 如何注册 Servlet 组件

SpringBoot 是如何通过 ServletContextInitializer 加载 Servlet 组件到 Servlet 容器的

业精于勤荒于嬉 1947

昆仑通态触摸屏时间锁应用示例

昆仑通态触摸屏时间锁应用示例

ServletContextInitializer的作用

> StandardContext.startInternal() SpringApplication.run线程外的一个新线程。-> RegistrationBean.onStartup(ServletContext servletContext) 由于RegistrationBean implements。

xxxxxxxxxxxxxxxxxxxxxx 723

【框架专题】——管理型容器——SpringBoot内置IOC容器/内置WEB容器原理

SpringBoot源码——内置Tomcat原理 SpringBoot源码——自动配置原理

weixin_44275259的博客 511

ServletContainerInitializer、WebApplicationInitializer、ServletContextInitializer有什么区别

版权声明:本文为博主原创文章,转载请附上原文出处链接和声明。 原文链接: http://uhfun.cn/tech/2020/05/22/傻傻分不清-ServletContainerInitializer-SpringServletContainerInitializer-WebApplicationInitializer-SpringBootServletInitializer-ServletContextInitializer都是些啥.html 这几个类乍一看有点像,仔细一看还是有点像,特别是Servl

uhfun的博客 2211

Spring Boot Servlet : ServletContextInitializer

概述 功能介绍 Spring Boot提供的在Servlet 3.0+环境中用于程序化配置ServletContext的接口。该接口ServletContextInitializer主要被RegistrationBean实现用于往ServletContext容器中注册Servlet,Filter或者EventListener。这些ServletContextInitializer的设计目的主要是用...

Details Inside Spring 6209

ServletContainerInitializer、WebApplicationInitializer、ServletContextInitializer

ServletContainerInitializer ServletContainerInitializer是servlet容器初始化时使用的接口,servlet容器通过java的SPI机制发现实现类,并实例化后调用初始化方法。具体的可以参考我之前的博客spring boot:servlet启动方式. WebApplicationInitializer org.springframework.web.SpringServletContainerInitializer类实现了ServletContainer

shuxiaohua的博客 607

spring boot启动加载tomcat原理深度剖析

spring boot应用打包成Fat jar时,启动内嵌tomcat的原理;spring boot应用打包成WAR时,外部tomcat启动spring boot SpringApplication的原理;自动化配置Servlet/ServletFilter/ServletListener的原理

ac_dao_di的专栏 5782

Spring boot 的Web应用工具类ServletContextInitializerBeans

概述 该类位于包 : org.springframework.boot.web.servlet ServletContextInitializerBeans实例表示一个从ListableBeanFactory bean容器中获得的ServletContextInitializer实例的集合。这个集合中的每个元素来自容器中定义的每个如下类型的bean : ServletContext

Details Inside Spring 3847

SpringBoot 官方文档示例:(62) ServletContextInitializer的用法

boot

amadeus_liu2的博客 486

Spring Boot 注册 Servlet 的五种方法

springboot里注册servlet的5中方法

IT- 研究者 759

Spring Boot 配置web.xml的listener

Spring Boot 配置listener 要将 <listener> <listener-class> org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener> 更改为Spring-Boot的配置方式具体代码如下...

weixin_30855761的博客 1606

servletcontext_springboot源码架构解析servletContext

说在前面前期回顾sharding-jdbc源码解析更新完毕spring源码解析 更新完毕spring-mvc源码解析 更新完毕spring-tx源码解析 更新完毕spring-boot源码解析 更新完毕rocketmq源码解析 更新完毕dubbbo源码解析 更新完毕netty源码解析 更新完毕spring源码架构更新完毕spring-mvc源码架构更新完毕springboot源码架构更...

weixin_39769091的博客 324

ServletContextInitializer和WebApplicationInitializer的区别

文章目录一、WebApplicationInitializer二、ServletContextInitializer三、反思 一、WebApplicationInitializer 实现原理: org.springframework.web.SpringServletContainerInitializer实现了javax.servlet.ServletContainerInitializer接口,在Servlet容器启动的时候,会自动探测WebApplicationInitializer的实现类,执行其o

wt_better的博客 2093

死磕源码系列【springbootServletContextInitializerBeans如何将Filter、Servlet、EventListener注册到ServletContext中源码解

ServletContextInitializerBeans类表示从ListableBeanFactory容器中获取到的ServletContextInitializer实例集合,包括所有的ServletContextInitializer beans,并且也包含Servlet、Filter、EventListener beans集合。 这些beans会被排序,按照Servlet->Filter->EventListener->ServletContextInitializer的顺序排列。

OceanSky的专栏 1278

ServletContainerInitializer与ServletContextInitializer学习笔记

ServletContainerInitializer加载原理及过程 Servlet3.x规范利用spi机制,自动加载实现ServletContainerInitializer接口的类,并调用onStartup方法。 SpringServletContainerInitializer根据@HandlesTypes(WebApplicationInitializer.class)进行class筛选。 在onStartup中调用所有WebApplicationInitializer对象的onStart方法。

yichengjie_c的博客 919

SpringBoot ServletContext初始化深度源码剖析(58)

ServletContext是Java EE规范中定义的重要接口,它代表了整个Web应用的上下文环境,为Web应用提供了全局共享的资源与信息。在Servlet规范中,每个Web应用在运行时都会有且仅有一个ServletContext实例,该实例由Servlet容器创建并管理。

Android开发领域创作者 1796

Spring注解驱动开发第52讲——使用ServletContext注册web三大组件

写在前面 上一讲,我们说了一下基于运行时插件的ServletContainerInitializer机制,而在这一讲中,我们就来详细讲一下ServletContext用来注册web组件的用法,即使用ServletContext注册web组件。这些web组件就是我们通常所说的web三大组件,也就是Servlet、Filter以及Listener。 为什么我们一定要掌握使用ServletContext来注册web组件呢?因为我们是一定会遇到这样场景的,如果是以注解的方式来注册web组件,那么前提是这些web组件

李阿昀的博客 2213

从源码理解SpringBootServletInitializer的作用

各位读友们好,最近已经很久没有更新文章了,并不是觉得写文章没意思之类的,笔者很希望能在"乱七八糟"的互联上做一些开源(能力有限,先做现有技术和思想开源。除了靠编程赚钱以外,这可能是支撑我一直学习的动力,希望能学到更多的内容开源出去)。之所以没有持续更新的原因——真的没时间。白天上班,晚上回去学习(为了以后给各位读者写更有深度的文章)。至于每天在学习什么内容,这个以后会无条件分享给大家(大概是偏底层方面的,各种中间件的源码和Linux内核源码等等)。好了,多的不提了,回归正题,今天也是在公司接手了一个老员工的

李哈zzz的博客 6931
上一篇: SpringBoot自定义条件注解
下一篇: SpringBoot扩展外部化配置--基于SpringBoot2.5.7
bearboy80
博客等级 码龄16年 4粉丝 43原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值