我正在尝试使用两个CacheManagers设置一个spring-boot应用程序,代码如下:
@SpringBootApplication
@EnableCaching
public class TestApplication {
...
}
@Configuration
public class TestGuavaCacheConfig extends CachingConfigurerSupport {
...
}
@Configuration
public class TestRedisCacheConfig extends CachingConfigurerSupport {
...
}
但是当我启动应用程序时,它总是失败并出现以下错误:
引起:java.lang.IllegalStateException:2的实现 当预期只有1时,发现了CachingConfigurer。重构 配置使得CachingConfigurer只实现一次或 一点也不。在 org.springframework.cache.annotation.AbstractCachingConfiguration.setConfigurers(AbstractCachingConfiguration.java:71) 〜[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE] at sun.reflect.NativeMethodAccessorImpl.invoke0(原生方法) 〜[na:1.8.0_66] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 〜[na:1.8.0_66] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 〜[na:1.8.0_66] at java.lang.reflect.Method.invoke(Method.java:497) 〜[na:1.8.0_66] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:654) 〜[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 〜[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) 〜[弹簧豆-4.2.4.RELEASE.jar:4.2.4.RELEASE]
...省略了59个常用帧
似乎spring-boot不支持两个CacheManager。这是真的吗?
答案 0 :(得分:0)
TL; DR CachingConfigurer
用于配置默认缓存设置。
这与Spring Boot无关,该接口(以及相关的异常)直接来自Spring Framework。
CachingConfigurer
允许您指定应用程序应使用的默认 CacheManager
。如异常所述,您不能拥有其中两个。这并不意味着你当然不能拥有两个缓存管理器。
你准备做什么?如果要定义两个缓存管理器并使用cacheManager
或@CacheConfig
注释的@Cacheable
属性,那么您的(仅)CacheConfigurer
实现应该定义默认值并且您应该像你在注释中引用的任何其他bean一样创建另一个。
如果要从一个缓存切换到另一个缓存,请考虑实现CacheResolver
,并将CacheManager
实例包装在其中。根据自定义注释和/或缓存名称,您将能够返回要与您的某些自定义代码一起使用的缓存。