如何在spring-boot

时间:2016-01-02 09:11:19

标签: spring-boot

我正在尝试使用两个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。这是真的吗?

1 个答案:

答案 0 :(得分:0)

TL; DR CachingConfigurer用于配置默认缓存设置。

这与Spring Boot无关,该接口(以及相关的异常)直接来自Spring Framework。

CachingConfigurer允许您指定应用程序应使用的默认 CacheManager。如异常所述,您不能拥有其中两个。这并不意味着你当然不能拥有两个缓存管理器。

你准备做什么?如果要定义两个缓存管理器并使用cacheManager@CacheConfig注释的@Cacheable属性,那么您的(仅)CacheConfigurer实现应该定义默认值并且您应该像你在注释中引用的任何其他bean一样创建另一个。

如果要从一个缓存切换到另一个缓存,请考虑实现CacheResolver,并将CacheManager实例包装在其中。根据自定义注释和/或缓存名称,您将能够返回要与您的某些自定义代码一起使用的缓存。