Spring源码分析【2】-Tomcat和Sping的连接点

Tomcat是怎么调用上Spring的呢?需要找到这个连接点。

答案就在org.apache.catalina.startup.ContextConfigprocessServletContainerInitializers方法

《Spring源码分析【2】-Tomcat和Sping的连接点》

new WebappServiceLoader()

《Spring源码分析【2】-Tomcat和Sping的连接点》

回到processServletContainerInitializers

《Spring源码分析【2】-Tomcat和Sping的连接点》

进入org.apache.catalina.startup.WebappServiceLoaderload方法

loader.getResources(configFile);

注意只有在WEB-INF/lib/spring-web-4.2.6.RELEASE.jar里定义了javax.servlet.ServletContainerInitializer文件META-INF/services/javax.servlet.ServletContainerInitializer

所以就会只加载到该文件忽视其他的jar包

《Spring源码分析【2】-Tomcat和Sping的连接点》

containerServicesFound集合

《Spring源码分析【2】-Tomcat和Sping的连接点》

loadServices

《Spring源码分析【2】-Tomcat和Sping的连接点》

返回不可变的集合services

《Spring源码分析【2】-Tomcat和Sping的连接点》

注意:这里使用了 Collections.unmodifiableList(services);

不可变集合,顾名思义就是说集合是不可被修改的。集合的数据项是在创建的时候提供,并且在整个生命周期中都不可改变。

返回WebappServiceLoader

《Spring源码分析【2】-Tomcat和Sping的连接点》

返回org.apache.catalina.startup.ContextConfig的processServletContainerInitializers方法

《Spring源码分析【2】-Tomcat和Sping的连接点》

initializerClassMap.put(sci, new HashSet<Class<?>>());

《Spring源码分析【2】-Tomcat和Sping的连接点》

HandlesTypes是Tomcat自定义的注解getAnnotation(HandlesTypes.class)

《Spring源码分析【2】-Tomcat和Sping的连接点》

class SpringServletContainerInitializer implements ServletContainerInitializer

《Spring源码分析【2】-Tomcat和Sping的连接点》

HandlesTypes

《Spring源码分析【2】-Tomcat和Sping的连接点》

for (Class<?> type : types)

org.springframework.web.WebApplicationInitializer不是注解

《Spring源码分析【2】-Tomcat和Sping的连接点》

interface WebApplicationInitializer

《Spring源码分析【2】-Tomcat和Sping的连接点》

 typeInitializerMap.put(type, scis); org.springframework.web.WebApplicationInitializer

《Spring源码分析【2】-Tomcat和Sping的连接点》

回到org.apache.catalina.startup.ContextConfig的webConfig()方法

《Spring源码分析【2】-Tomcat和Sping的连接点》

读取/WEB-INF/classes资源文件

《Spring源码分析【2】-Tomcat和Sping的连接点》

    原文作者:Spring Boot
    原文地址: https://blog.csdn.net/unix21/article/details/52094673
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞