概述
今天发现一个项目是传统的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时使用之前创建的容器。
最后
以上就是无限柠檬为你收集整理的web.xml只需配置DispatcherServlet无需配置ContextLoaderListener的原因的全部内容,希望文章能够帮你解决web.xml只需配置DispatcherServlet无需配置ContextLoaderListener的原因所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复