Отключить кэширование метода spring через внешнее свойство

Я настроил кэширование метода spring с Ehcache и конфигурацией, управляемой аннотациями.

Я хотел бы, однако, иметь возможность отключить его из файла конфигурации, который мы используем в приложении.

моей первой мыслью было позвонить net.sf.ehcache.CacheManager.CacheManager() без аргументов, если кэширование метода отключено. Это вызывает исключение:

java.lang.IllegalArgumentException: loadCaches must not return an empty Collection
at org.springframework.util.Assert.notEmpty(Assert.java:268)
at org.springframework.cache.support.AbstractCacheManager.afterPropertiesSet(AbstractCacheManager.java:49)

моей второй идеей было настроить net.sf.ehcache.CacheManager.CacheManager() с данными по умолчанию, чтобы кэш не использовался (maxElementsInMemory 0 и т. д.). Зато кэш все еще используется, что не то, что я хочу.

есть свойство net.sf.ehcache.disabled но я не хочу отключать кэширование hibernate, которое также использует ehcache.

Q как я могу настроить все, чтобы иметь кэширование метода spring, но отключить его из моего внешнего файла конфигурации? Я не хочу изменять контекст приложения или код, чтобы включить/отключить кэширование метода. Можно изменить только файл конфигурации, который мы используем в приложении.

2 ответов


то, что я искал был NoOpCacheManager:

чтобы заставить его работать, я переключился с создания XML-бобов на фабрику

Я сделал следующее:

@Bean
public CacheManager cacheManager() {
    final CacheManager cacheManager;        
    if (this.methodCacheManager != null) {
        final EhCacheCacheManager ehCacheCacheManager = new EhCacheCacheManager();
        ehCacheCacheManager.setCacheManager(this.methodCacheManager);
        cacheManager = ehCacheCacheManager;
    } else {
        cacheManager = new NoOpCacheManager();
    }

    return cacheManager;
}

вы можете использовать весна профиль, чтобы включить (или нет) поддержку кэширования spring

<beans profile="withCache">
   <cache:annotation-driven />
</beans>