Spring源码分析【2】-Tomcat和Sping的连接点
Tomcat是怎么調用上Spring的呢?需要找到這個連接點。
答案就在org.apache.catalina.startup.ContextConfig的processServletContainerInitializers方法
new WebappServiceLoader()
回到processServletContainerInitializers
進入org.apache.catalina.startup.WebappServiceLoader的load方法
loader.getResources(configFile);
注意只有在WEB-INF/lib/spring-web-4.2.6.RELEASE.jar里定義了javax.servlet.ServletContainerInitializer文件META-INF/services/javax.servlet.ServletContainerInitializer
所以就會只加載到該文件忽視其他的jar包
containerServicesFound集合
loadServices
返回不可變的集合services
注意:這里使用了?Collections.unmodifiableList(services);
不可變集合,顧名思義就是說集合是不可被修改的。集合的數據項是在創建的時候提供,并且在整個生命周期中都不可改變。
返回WebappServiceLoader
返回org.apache.catalina.startup.ContextConfig的processServletContainerInitializers方法
對initializerClassMap.put(sci, new HashSet<Class<?>>());
HandlesTypes是Tomcat自定義的注解getAnnotation(HandlesTypes.class)
class SpringServletContainerInitializer implements ServletContainerInitializer
HandlesTypes
for (Class<?> type : types)
org.springframework.web.WebApplicationInitializer不是注解
interface WebApplicationInitializer
?typeInitializerMap.put(type, scis);?org.springframework.web.WebApplicationInitializer
回到org.apache.catalina.startup.ContextConfig的webConfig()方法
讀取/WEB-INF/classes資源文件
總結
以上是生活随笔為你收集整理的Spring源码分析【2】-Tomcat和Sping的连接点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring源码分析【0】-框架的基础:
- 下一篇: Spring源码分析【1】-Tomcat