我是靠谱客的博主 无限柠檬,最近开发中收集的这篇文章主要介绍web.xml只需配置DispatcherServlet无需配置ContextLoaderListener的原因,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

今天发现一个项目是传统的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的原因所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部