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时使用之前创建的容器。
在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值