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

Spring mvc:SpringServletContainerInitializer

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.lryc.cn/news/108896.html

相关文章:

  • 微信小程序中的全局数据共享(状态管理)使用介绍
  • LLM - LLama 模型读取报错 TypeError: not a string
  • 2023年08月在线IDE流行度最新排名
  • k8s的架构
  • 数据分析基础-Excel图表的美化操作(按照教程一步步操作)
  • Mybatis嵌套查询(一对多)
  • web前端转正工作总结范文5篇
  • P1144 最短路计数
  • Docker入门之命令
  • Multimodal Learning with Transformer: A Survey
  • 网工内推 | 实施、售后工程师,厂商认证优先
  • 小程序商品如何设置限购
  • 通信原理复习公式整理(自用/持续更新)
  • TypeScript实战篇 - TS实战: 服务层开发 - 完整的聊天服务
  • 【雕爷学编程】MicroPython动手做(32)——物联网之MQTT
  • 操作系统专栏4-网络专题from小林coding
  • 《C和指针》(6)指针
  • 零基础强化学习入门分享
  • QT快捷键
  • LabVIEW 开发在不确定路况下自动速度辅助系统
  • 《面试1v1》ElasticSearch 和 Lucene
  • P5727 【深基5.例3】冰雹猜想
  • ConcurrentHashMap1.7 源码浅析
  • 跨境电商时代的安全护航
  • JavaScript Es6 _1 笔记
  • 结构体和 Json 相互转换(序列化反序列化)
  • 【力扣刷题 | 第二十四天】
  • PyTorch使用(一)(常用库)
  • React ~ React Router 6
  • 【LeetCode每日一题】——304.二维区域和检索-矩阵不可变