Spring mvc:SpringServletContainerInitializer

news/2025/3/14 17:13:25/

SpringServletContainerInitializer实现了Servlet3.0规范中定义的ServletContainerInitializer:

public interface ServletContainerInitializer {void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException;
}

SpringServletContainerInitializer代码如下:

@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {@Overridepublic void onStartup(@Nullable Set<Class<?>> webAppInitializerClasses, ServletContext servletContext)throws ServletException {List<WebApplicationInitializer> initializers = Collections.emptyList();if (webAppInitializerClasses != null) {initializers = new ArrayList<>(webAppInitializerClasses.size());for (Class<?> waiClass : webAppInitializerClasses) {// Be defensive: Some servlet containers provide us with invalid classes,// no matter what @HandlesTypes says...if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) &&WebApplicationInitializer.class.isAssignableFrom(waiClass)) {try {initializers.add((WebApplicationInitializer)ReflectionUtils.accessibleConstructor(waiClass).newInstance());}catch (Throwable ex) {throw new ServletException("Failed to instantiate WebApplicationInitializer class", ex);}}}}if (initializers.isEmpty()) {servletContext.log("No Spring WebApplicationInitializer types detected on classpath");return;}servletContext.log(initializers.size() + " Spring WebApplicationInitializers detected on classpath");AnnotationAwareOrderComparator.sort(initializers);for (WebApplicationInitializer initializer : initializers) {initializer.onStartup(servletContext);}}}

因为它使用了@HandlesTypes(WebApplicationInitializer.class)注解,所以web容器会寻找类路径上实现了WebApplicationInitializer的类。

它在onStartup方法中会分别调用WebApplicationInitializer的onStartup方法。

SpringServletContainerInitializer的onStartup方法会被支持Servlet3.0规范的web 容器(比如tomcat 9)自动调用

Spring-web模块的META-INFO目录的services目录下有名为javax.servlet.ServletContainerInitializer的文件,内容是

org.springframework.web.SpringServletContainerInitializer

可见,SpringServletContainerInitializer是通过SPI机制加载的。


http://www.ppmy.cn/news/1001402.html

相关文章

2023河南萌新联赛第(四)场 L.7是大奖?(数位DP基础)

文章目录 题目大意题解参考代码总结 题目大意 ( 1 ≤ l , r ≤ 1 0 18 ) (1\leq l,r\leq 10^{18}) (1≤l,r≤1018) 题解 由题目可得 ①&#xff1a;统计数字出现次数&#xff1b; ②&#xff1a;直接暴力计算无法得出&#xff1b; ③&#xff1a;输入给定区间。 满足使用数位…

如何从 html 页面调用在 javascript 模块 (type=module) 中声明的函数

首先&#xff0c;必须明确导出您的功能 export function greet() {alert("Hello from module"); } 其次&#xff0c;模块有它自己的范围&#xff08;这是模块的全部意义&#xff09;&#xff0c;因此您需要将函数添加到全局范围。因此&#xff0c;要做到这一点&…

企业真实的自动化框架?资深8年测试是如何设计实施的...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 什么是框架&#…

docker 哨兵模式和集群模式安装Redis7.0.12

docker 哨兵模式和集群模式安装Redis7.0.12 1.下载镜像 1.1 配置阿里云加速源 墙外能访问https://hub.docker.com/_/redis 的可跳过 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 登录后选择左侧的镜像工具>镜像加速器&#xff0c;获取加速器地址&#…

活动目录密码更改

定期更改密码是一种健康的习惯&#xff0c;因为它有助于阻止使用被盗凭据的网络攻击&#xff0c;安全专家建议管理员应确保用户使用有效的密码过期策略更改其密码。 管理员可以通过电子邮件通知用户在密码即将过期时更改其密码&#xff0c;但在许多组织中&#xff0c;用户只能…

【MYSQL】MYSQL学习笔记【基础篇】【未完待续】

文章目录 MYSQL入门一、MYSQL概述1. 数据库相关概念1.1 数据库&#xff0c;数据库管理系统与SQL1.2 数据库种类以及主流数据库管理系统排名1.3 MySQL数据库安装1.4 数据模型 二、SQL2.1 通用语法与注释2.2 SQL分类2.3 DDL2.3.1 数据库操作2.3.2 表操作2.3.2.1 表操作-查询创建2…

spring boot+thymeleaf+semantic ui 分页

参考&#xff1a; https://my.oschina.net/ayyao/blog/898041 后端 springboot 使用&#xff1a; com.github.pagehelper.PageInfo&#xff0c;作为分页对象 <!--引入分页插件--> <dependency><groupId>com.github.pagehelper</groupId><artifa…

【CSS】3D卡片效果

效果 index.html <!DOCTYPE html> <html><head><title> Document </title><link type"text/css" rel"styleSheet" href"index.css" /></head><body><div class"card"><img…