Использование прокси CGLIB с Ehcache CacheManager

Я хочу использовать Spring AOP в своем весеннем приложении. При создании прокси-сервера AOP для net.sf.ehcache.CacheManager инициализация контекста 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 пытается создать прокси AOP для net.sf.ehcache.CacheManager, и это удается с первого раза и дает имя по умолчанию для CacheManager __DEFAULT__ (нашел это, добавив операторы отладки в код ehcache, построив его по источнику и используя это в моем приложении). Теперь, если у меня есть несколько менеджеров кеша, таких как abcCacheManager и xyzCacheManager (типа EhCacheManagerFactoryBean), Spring обнаруживает несколько net.sf.ehcache.CacheManagers и пытается создать прокси-объекты (что-то вроде net.sf.ehcache.CacheManager$$EnhancerByCGLIB$$b18c5958) для всех из них, но с версией EhCache> = 2.5, у нас не может быть более одного кэша с одинаковым именем на одной виртуальной машине.

Я использую EhCache 2.5.1 и не хочу возвращаться к 2.4 только для этой цели. Я не уверен, действительно ли это проблема, как я могу решить эту проблему.

Примечание. Обратите внимание, поможет ли это, но я также заметил из операторов отладки, что конструктор CacheManager no-arg вызывается только генератором прокси-сервера spring / CGLIB, а xyzCacheManager вызывает его, передавая конфигурацию в качестве аргумента.


person Swapnil    schedule 09.09.2012    source источник
comment
Вам действительно нужен прокси CGLIB для CacheManager?   -  person jeha    schedule 10.09.2012


Ответы (1)


Примечание: я отвечаю на это сам, так как это может помочь другим, столкнувшимся с той же проблемой.

Комментарий jeha по моему вопросу имеет смысл, поскольку этот прокси-сервер мне вообще не нужен, но поскольку я Я новичок в Spring AOP и прокси, я не знал, как работает механизм автоматического прокси. Поскольку я изменил выражения pointcut в своем совете, после этого я не столкнулся с вышеуказанной проблемой. До этого почти все bean-компоненты в контейнере были проксированы, и отсюда возникла проблема.

person Swapnil    schedule 12.09.2012