前言
本文参考了:
以及:
DispatcherServlet 和 ContextLoaderListener 的关系,到底用哪个?
【Spring】浅谈ContextLoaderListener及其上下文与DispatcherServlet的区别
值得注意的是,【【Spring】浅谈ContextLoaderListener及其上下文与DispatcherServlet的区别】中阐述了contextLoaderListener和dispatcherServlet的关系,
contextLoaderListener创建的上下文context默认配置就是applicationContext.xml,而DispatchServlet创建的context默认配置是spring-servlet.xml,而contextLoaderListener先创建上下文–这个上下文不如叫app上下文,后者DipatcherServlet将前者的上下文作为父亲上下文进行继承然后再创建自己的上下文–不如成为mvc上下文,当一个bean在mvc上下文中无法获取就会溯源到父上下文–app上下文获取。
因为同时有父子上下文,所以假如两个配置中都配置了同样的bean或者contextLoaderListener和DispatcherServlet中都使用同一个配置,那么就会产生初始化两次的囧况,
下面这样才是对的:
两者使用的配置文件是不一样的,不能用同一个,也不能在两个配置文件都注册一个bean。
这篇文章讲解了两个配置的关系:
springmvc.xml和applicationContext.xml配置的特点
因为contextLoaderListener继承自servletContextListener,
所以它合适初始化service,dao,数据库连接池,mybatis,定时任务等等bean对象----注意这些都与request对象无关,无需调用web开发中的request或者response对象的。
而DispatchServlet适合初始化controller,views视图层等对象—注意到它本身就是servlet,能够随意调用request等对象,当然,异步action也在这里设定,后文再说这个异步请求。
而文章【DispatcherServlet 和 ContextLoaderListener 的关系,到底用哪个?】出现的原因就是恐怕两个上下文用同一个配置文件或者两个配置文件有重合的地方,所以才会出现初始化两次。