tomcat (SCI)ServletContainerInitializer 的加载原理

问题:使用WebScoket的时候发现通过@ServerEndpoint方式注册上去的url无法访问,报错404

经过排查发现在WsServerContainer这个类中的addEndpoint方法一直没有触发ServerEndpoint注解的扫描

通过该方法来源于StandardContext.startInternal()方法的调用如下图:

根据上图可以发现所用来的扫描的pojo来源于 initializers 这个属性,向上追溯确定了该属性的数据来源于ContextConfig的 initializerClassMap 属性

在ContextConfig当中有一个processServletContainerInitializers方法,当中会取loda META-INF/services/ 目录下所有的javax.servlet.ServletContainerInitializer实现,存入initializerClassMap 当中。

解析来会解析所有的HandlesTypes 条目,并且会判断改sic是否存在Handles,如果存在则会修改属性,以方便后面的呢解析

最后在ContextConfig当中会通过checkHandlesTypes方法来检测被该注解配置的类,然后全部扫描到initializerClassMap当中

相关推荐
XXOOXRT10 小时前
基于SpringBoot的加法计算器
java·spring boot·后端·html5
阿崽meitoufa10 小时前
JVM虚拟机:垃圾收集器和判断对象是否存活的算法
java·jvm·算法
我是苏苏11 小时前
C#高级:使用ConcurrentQueue做一个简易进程内通信的消息队列
java·windows·c#
heartbeat..12 小时前
数据库基础知识体系:概念、约束、范式与国产产品
java·数据库·学习笔记·国产数据库
PXM的算法星球13 小时前
【操作系统】哲学家就餐问题实现详解
java
2301_8153577013 小时前
Java项目架构从单体架构到微服务架构的发展演变
java·微服务·架构
Ethan-D13 小时前
#每日一题19 回溯 + 全排列思想
java·开发语言·python·算法·leetcode
Echoo华地13 小时前
idea运行程序默认线程为daemon线程的问题
java·ide·intellij-idea
歪楼小能手13 小时前
Android16系统go版关闭重力旋转开关后缺失手动旋转屏幕悬浮按钮
android·java·平板
Coder_Boy_13 小时前
基于SpringAI的在线考试系统-DDD业务领域模块设计思路
java·数据库·人工智能·spring boot·ddd