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

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】

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

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

20191017100205\_1.png

new WebappServiceLoader()

20191017100205\_2.png

回到processServletContainerInitializers

20191017100205\_3.png

进入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包

20191017100205\_4.png

containerServicesFound集合

20191017100205\_5.png

loadServices

20191017100205\_6.png

返回不可变的集合services

20191017100205\_7.png

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

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

返回WebappServiceLoader

20191017100205\_8.png

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

20191017100205\_9.png

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

20191017100205\_10.png

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

20191017100205\_11.png

class SpringServletContainerInitializer implements ServletContainerInitializer

20191017100205\_12.png

HandlesTypes

20191017100205\_13.png

for (Class<?> type : types)

org.springframework.web.WebApplicationInitializer不是注解

20191017100205\_14.png

interface WebApplicationInitializer

20191017100205\_15.png

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

20191017100205\_16.png

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

20191017100205\_17.png

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

20191017100205\_18.png


来源:[]()

赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » Spring源码分析【2】-Tomcat和Sping的连接点

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏