[转]web.xml什么时候被加载进内存的
tomcat架构图
tomcat的启动过程
tomcat架构图中可以看到
一个web项目 在tomcat逻辑里其实就是一个StandardContext
,一个web项目对应一个web.xml。
顺着这个思路 看tomcat启动图中可以看到
4.1.1.1.1.1.1.6 ------ 4.1.1.1.1.1.1.7 中tomcat 加载web.xml 的类也是StandardContext
, 最终解析是在ContextConfig
中的webConfig
方法解析完生成一个WebXml 对象
解析和生成WebXml对象的过程如下
注(点击可进入具体文章):
web-fragment.xml 为 servlet3.0规范
SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件
ServletContainerInitializer
`web.xml加载过程` 1.全局默认配置文件:tomcat目录下conf/web.xml解析为WebXml对象。 2.具体应用程序下的web.xml解析:例 /examples/WEB-INF/web.xml 3.扫描应用程序examples下的所有Jar,查找`META-INF/web-fragment.xml`文件并解析,保存到变量fragments中,格式<String,WebXml>。 4.已经检索到的WebXml配置进行排序。 5.基于SPI机制查找ServletContainerInitializer的实现。 6.扫描/WEB-INF/classes下面的类,处理Annotation:@ WebServlet,@ WebFilter,@ WebListener 7、扫描jar包中的Annotation:web-fragment.xml所在的jar包。 8、合并配置:所有web-fragment.xml中的配置,合并到应用程序examples中的配置web.xml。 9、合并配置:全局默认配置defaults 合并到应用程序的web.xml。 10、将JSP转换为Servlet。 11、将合并后的最终配置web.xml对象webXml应用到servlet容器(ServletContext),装配servlet上下文; 12、将配置信息保存容器中,供其他组件访问,使得其他组件不需要再次重复上面的步骤去获取配置信息了。 13、查找jar包中的静态资源。 14、将ServletContainerInitializer应用到上下文。
参考链接:
https://www.jianshu.com/p/090e7a7e6403
https://blog.csdn.net/tuoni123/article/details/80149752
https://blog.csdn.net/ahou2468/article/details/79015251
https://sq.163yun.com/blog/article/189808829158150144
https://jinnianshilongnian.iteye.com/blog/1750736