今天发现一个项目是传统的SSM架构,查看其web.xml配置文件发现只配置了DispatcherServlet,将所有的请求进行了拦截。但是这个servlet属于springmvc并不是spring的,所以spring容器并没有被构建,那是如何构建spring容器的呢?
通过断点发现,在tomcat启动过程中,创建了DispatcherServlet,该servlet继承FrameworkServlet
在这里插入图片描述

这里有个initServletBean方法,该方法会在tomcat启动时被调用!从而创建spring容器(WebApplicationContext)

tomcat如何调用的呢?
FrameworkServlet继承HttpServletBean,在该类中可以找到init方法,在该方法中会调用initServletBean方法,该方法被修饰为protect所以只有子类才能复写,所以FrameworkServlet必须继承然后复写,从而在tomcat启动时创建DispatcherServlet时创建整个Spring容器,其实在该方法调用过程中,Spring会判断是否程序中已经创建了容器也就是web.xml配置了ContextLoaderListener(最后讲),该listener会创建容器,所以如果有的话使用配置的,否则创建新的容器。
在这里插入图片描述在这里插入图片描述
查看tomcat源码可以发现,在创建servlet中会调用servlet的init方法,因DispatcherServlet间接继承servlet所以创建完成后会被调用init之后确保生成spring容器。
在这里插入图片描述

关于如何创建的spring容器

从第一张图中的initWebApplicationContext方法往下一路跟进去,会发现,在这里会通过SerletContext去获取容器,key为容器类名+“ROOT”,如果attr不为null就会返回所以会使用配置的,如果为null就会创建新的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查看ContextLoaderListener会发现在servlet在初始化的时候会发布回调实现了contextInitialized的监听器,此时spring容器会被设置到servetcontext中进去,故在后续创建DispatherServlet时使用之前创建的容器。
在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐