web-xml加载过程
2019-06-16 本文已影响0人
MakeACoder
上图
tomcat架构图
5a26687d0001ca2712300718.png 20180109110049444.jpgtomcat的启动过程
20161209134750534.pngtomcat架构图中可以看到
一个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://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