有几种方法可以做到这一点,正确的答案取决于你对缓存的使用。
你有一个“主”缓存管理器
如果您将 CacheManager A 用于 90% 的用例,而 B 用于 10%,我建议为 A 创建一个默认的 CacheManager(您需要通过 CacheConfigurerSupport 扩展名指定它),有些东西喜欢:
@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {
@Override
@Bean // not strictly necessary
public CacheManager cacheManager() { ... CacheManager A }
@Bean
public CacheManager bCacheManager() { ... CacheManager B }
}
然后对于 10% 的用例,您在需要使用其他缓存管理器的类的顶部添加 CacheConfig
@CacheConfig(cacheManager="bCacheManager")
public class MyService { /*...*/ }
如果您只需要为一个方法使用另一个缓存管理器,您也可以在方法级别指定它
@Cacheable(cacheNames = "books", cacheManager = "bCacheManager")
public Book findById(long id) { /*...*/ }
更精细的分辨率
如果您不处于这种情况,您需要一种方法来了解需要根据具体情况使用哪个缓存管理器。您可以根据目标类型 (MyService) 或缓存名称 (books) 执行此操作。您需要实现一个 CacheResolver 来为您进行翻译。
@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {
@Override
public CacheResolver cacheResolver() { ... }
}
查看CacheResolver 的javadoc 了解更多详情。在实现中,您可能有多个 CacheManager 实例(作为 bean 或不作为 bean),您将根据您的逻辑在内部调用它们以确定应该使用哪个管理器。
我在评论中看到您指的是“模块”。缓存实际上是一个基础设施问题,所以我强烈建议您在应用程序级别移动该决定。您可以将缓存标记为“本地”,而将其他标记为“集群”。但是您可能应该对名称进行某种命名以使其更容易。不要在模块级别选择缓存管理器。
this blog post 用其他例子说明了这一点。