我想在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
通过传递调用它配置为参数。
答案 0 :(得分:0)
注意:我自己也在回答这个问题,因为它可能会帮助那些面临同样问题的人。
jeha对我的问题的评论是有道理的,因为我不应该首先需要该代理,但由于我是Spring AOP和代理的新手,我不知道如何自动代理机制有效。当我在我的建议中修改切入点表达式时,之后我没有遇到上述问题。在此之前,容器中几乎所有的bean都被代理,因此问题就出现了。