2016-01-02 818 views
0

我試圖設置有兩個CacheManagers彈簧啓動應用程序,有如下代碼:如何設置兩個不同的CacheManager在春季啓動

@SpringBootApplication 
@EnableCaching 
public class TestApplication { 
... 
} 

@Configuration 
public class TestGuavaCacheConfig extends CachingConfigurerSupport { 
... 
} 

@Configuration 
public class TestRedisCacheConfig extends CachingConfigurerSupport { 
... 
} 

但是當我啓動應用程序,它總是失敗與以下錯誤:

Caused by: java.lang.IllegalStateException: 2 implementations of CachingConfigurer were found when only 1 was expected. Refactor the configuration such that CachingConfigurer is implemented only once or not at all. at 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(Native Method) ~[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) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]

... 59 common frames omitted

似乎春季啓動不能支持兩個CacheManager(s)。這是真的 ?

+0

關於堆棧跟蹤,似乎春季啓動只需要一個實現。不過,我不會看到任何理由同時使用兩種不同的實現。 –

回答

0

TL; DR CachingConfigurer旨在配置默認的緩存設置。

這與Spring Boot無關,該接口(和相關的異常)直接來自Spring Framework。

CachingConfigurer允許您指定應用程序應該使用的默認CacheManager。作爲例外狀態,你不能有兩個。這並不意味着你當然不能擁有兩個緩存管理器。

你想要做什麼?如果您想要定義兩個緩存管理器並使用@CacheConfig@Cacheable註釋的cacheManager屬性,那麼您的(唯一的)實現應定義默認的一個,並且應該像在註釋中引用的任何其他bean一樣創建另一個。

如果您想從一個緩存切換到另一個緩存,請考慮實施CacheResolver,而不是將其中的CacheManager實例包裝在其中。基於自定義註釋和/或緩存名稱,您將能夠返回緩存以與您的某些自定義代碼一起使用。

+0

你能提供一個如何使用CacheResolver的例子嗎? –