编程技术分享平台

网站首页 > 技术教程 正文

spring mvc 配置失效了?(springmvc的配置)

xnh888 2024-10-19 16:00:42 技术教程 25 ℃ 0 评论

版本:spring 3.0以上

项目中有两个spring的配置xml,如下

项目中的web.xml

web.xml的配置如下:

1、ContextLoaderListener加载applicationContext-service-database.xml

2、DispatcherServlet加载database-servlet.xml。如果不配置contextConfigLocation的话,DispatcherServlet会默认查找${project.dir}\src\main\webapp\WEB-INF\{servlet-name}-servlet.xml。

如本例:servlet-name=database,则文件名为database-servlet.xml,所有会查找${project.dir}\src\main\webapp\WEB-INF\database-servlet.xml

3、这样配置最终spring会产生两个容器,ContextLoaderListener会生成容器A,DispatcherServlet会生成容器B,容器B的父容器是容器A,容器A的父容器为null

4、容器B会继承容器A的部分功能(其实这样做主要是为了防止单例bean的重复注入和容器B可以获取到容器A的bean,这样进行bean共享,但是容器A获取不到容器B的bean)

5、这样的配置spring mvc就有了,不需要在database-servlet.xml中配置<mvc:annotation-driven/>

问题:

如果在applicationContext-service-database.xml配置<mvc:annotation-driven/>,而在database-servlet.xml没有配置<mvc:annotation-driven/>,这样就会导致spring mvc功能失效,访问地址会404

原因:

因为如果在applicationContext-service-database.xml配置<mvc:annotation-driven/>,就会导致ContextLoaderListener加入容器A提前把spring mvc加载到容器A中,但是此时容器A,并没有database-servlet.xml中对应需要向外暴露的接口、url或controller。当DispatcherServlet加载容器B的时候发现,它的父容器A中已经存在spring mvc的相关功能,就不会重复加载,所以就会导致spring mvc的功能失效

关键代码:

这只是spring mvc 其中一个功能,其他相关功能请查看DispatcherServlet中init*方法

解决办法:

不要在ContextLoaderListener加载任何与spring mvc相关的功能

最后

ContextLoaderListener就是为了加载公用的类而存在的

一般ContextLoaderListener只有一个,而DispatcherServlet可以有多个,每个DispatcherServlet都会默认的以ContextLoaderListener加载的容器为父容器。

所以请按照spring 的套路来,减少不必须的问题

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表