编程语言
首页 > 编程语言> > 如何在spring cache java中配置多个缓存管理器

如何在spring cache java中配置多个缓存管理器

作者:互联网

我希望在我的Web应用程序中配置多个Spring缓存管理器,并且我可以在项目的不同位置使用不同的缓存管理器.有没有办法做到这一点.

解决方法:

有几种方法可以做到这一点,正确的答案取决于您对缓存的使用.

你有一个“主”缓存管理器

如果你使用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)或缓存(书籍)的名称来执行此操作.您需要实现一个CacheResolver来为您执行该转换.

@Configuration
@EnablleCaching
public class CacheConfig extends CachingConfigurerSupport {

    @Override
    public CacheResolver cacheResolver() { ... }
}

检查CacheResolver的javadoc以获取更多详细信息.在实现中,您可能有几个CacheManager实例(无论是否为bean),您将根据您的逻辑在内部调用,以确定应使用哪个管理器.

我在评论中看到你指的是“模块”.缓存实际上是一个基础架构问题所以我强烈建议您在应用程序级别上移动该决策.您可以将缓存标记为“本地”,将其他标记为“群集”.但是你应该对名称有一些命名,以使其更容易.不要在模块级别选择缓存管理器.

this blog post通过其他示例说明了这一点.

标签:spring-cache,java,spring,caching,spring-boot
来源: https://codeday.me/bug/20190928/1827084.html