征服.刘华强 2013-08-19 13:51
浏览 291
已采纳

Spring3.2MVC ContextLoaderListener DispatcherServlet 加载冲突

使用的是Spring3MVC_M2 版本
之前在Web.xml中配置如下
[code="xml"]

SpringMVC_Servlet
org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

/WEB-INF/spring-app.xml,
/WEB-INF/spring-mybatis.xml,
/WEB-INF/spring-aop.xml,
/WEB-INF/spring-ehcache.xml


1


SpringMVC_Servlet
*.do

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
    /WEB-INF/spring-app.xml,
    /WEB-INF/spring-mybatis.xml,
    /WEB-INF/spring-aop.xml,
    /WEB-INF/spring-ehcache.xml
</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

[/code]

[size=x-large]程序运行没问题,然后我在项目当中与Ehcache集成,导入Ehcache的jar包,然后增加配置如下[/size]
[code="xml"] <!-- 开启缓存对注解的支持 -->

<!-- 配置Ehcache缓存管理器,读取配置文件 -->
<bean id="ehCacheManagerFactoryBean" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="configLocation" value="classpath:ehcache.xml"></property>
</bean>

<!-- 配置缓存管理器,获取cache -->
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" >
    <property name="cacheManager" ref="ehCacheManagerFactoryBean" />
</bean>[/code]

[size=x-large]然后再启动就报错了
Another unnamed CacheManager already exists in the same VM. Please provide unique names for each CacheManager in the config or do one of following:
[color=red]意思是说有重复的ID,因为以前配置过 所以我觉得肯定不是配置的原因,后来发现有一个地方不一样,那就是WEB.XML当中配置了ContextLoaderListener!!!我把它注释上启动就不报错了。
所以问题就来了。
1:为什么以前配置DispatcherServlet与ContextLoaderListener并不冲突,但是加上Eheache以后就说ID有重复。
2:我需要在程序当中得到Bean,所以我配置ContextLoaderListener。然后通过ServletContext拿到WebApplicationContext 最终得到Bean。如果我不配置ContextLoaderListener如何在Controller中得到Bean.
3: 请教一下 如果配置了DispatcherServlet 它不就会加载配置文件然后初始化Bean了吗 那还配置ContextLoaderListener有啥用,二者有什么区别。
[/color]
[/size]

[color=green][size=x-large]以上3点是我不解的地方 谢谢[/size][/color]

  • 写回答

5条回答

  • zyn010101 2013-08-19 15:13
    关注

    springmvc和spring的ContextLoaderListener各自初始化一个ioc容器,ContextLoaderListener初始化的容器放入了ServletContext中,我们通常用的就是这个容器,用springmvc的话,所有的sping配置文件都是被加载两次的,springmvc在DispatcherServlet中初始化出来的容器相当于struts的ioc容器,主要用来做url映射用的。你所描述的原因是因为:ehcache再2.5版本以后CacheManager使用了Singleton,这样在创建多个CacheManager时就会产生上述错误。你有两种选择来解决这个问题:1.换个低版本的ehcache;2.不要再spring文件中配置CacheManager这个bean,你在自定义servlet或者filter或者listener(web.xml中listener一定要放在ContextLoaderListener的后面)中从servletContext中获取webApplicationContext,手动往里面加入cacheManager,(ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 vc6.0中想运行代码的时候总是提示无法打开文件是怎么回事
  • ¥25 关于##爬虫##的问题,如何解决?:
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型
  • ¥50 buildozer打包kivy app失败
  • ¥30 在vs2022里运行python代码
  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题