将CGLIB代理与Ehcache CacheManager一起使用

时间:2012-09-09 12:42:10

标签: spring ehcache spring-aop cglib

我想在Spring应用程序中使用Spring AOP。在为net.sf.ehcache.CacheManager创建AOP代理时,spring上下文初始化失败,但出现以下异常:

nested exception is org.springframework.aop.framework.AopConfigException: Could not
generate CGLIB subclass of class [class net.sf.ehcache.CacheManager]: Common causes of 
this problem include using a final class or a non-visible class; nested exception is 
net.sf.cglib.core.CodeGenerationException: net.sf.ehcache.CacheException-->Another   
unnamed CacheManager already exists in the same VM. Please provide unique names for 
each CacheManager in the config or do one of following:
1. Use one of the CacheManager.create() static factory methods to reuse same  
CacheManager with same name or create one if necessary
2. Shutdown the earlier cacheManager before creating new one with same name.
The source of the existing CacheManager is: InputStreamConfigurationSource 
[stream=java.io.ByteArrayInputStream@955b34]

这是我对这个问题的理解 - Spring正在尝试为net.sf.ehcache.CacheManager创建AOP代理,并且它第一次成功并为CacheManager __DEFAULT__提供一个默认名称(通过添加调试语句找到它) ehcache代码,按源构建代码并在我的应用程序中使用它。现在,如果我有多个缓存管理器,如'abcCacheManager'和'xyzCacheManager'(类型为EhCacheManagerFactoryBean),Spring会遇到多个net.sf.ehcache.CacheManager并尝试为所有这些缓存管理器创建代理对象(如net.sf.ehcache.CacheManager$$EnhancerByCGLIB$$b18c5958) ,但是使用EhCache> = 2.5版本,我们在同一个VM下不能有多个具有相同名称的缓存。

我正在使用EhCache 2.5.1,并且为了这个目的,我想避免回到2.4。我不确定这是否真的是我能克服这个问题的问题。

注意:请注意这是否有帮助,但我也从调试语句中注意到CacheManager no-arg构造函数仅由spring / CGLIB代理生成器调用,xyzCacheManager通过传递调用它配置为参数。

1 个答案:

答案 0 :(得分:0)

注意:我自己也在回答这个问题,因为它可能会帮助那些面临同样问题的人。

jeha对我的问题的评论是有道理的,因为我不应该首先需要该代理,但由于我是Spring AOP和代理的新手,我不知道如何自动代理机制有效。当我在我的建议中修改切入点表达式时,之后我没有遇到上述问题。在此之前,容器中几乎所有的bean都被代理,因此问题就出现了。