首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >第三方Spring库中的缓存管理器

第三方Spring库中的缓存管理器
EN

Stack Overflow用户
提问于 2017-09-25 10:17:20
回答 1查看 1K关注 0票数 1

假设您创建了一个Spring库,它为某些远程服务提供服务组件。服务组件希望在内部缓存响应数据,Spring缓存是非常合适的。另外,假设缓存需要比任何默认缓存(超时、最大大小等)稍微高级一些,因此库提供了一个缓存管理器来创建它。但是,您不希望第三方缓存管理器突然负责包含库的项目中使用的所有缓存(项目可能有自己的缓存)。

我观察到的行为是,如果项目使用使用简单application.properties配置的缓存(例如ehcache -参见下面的示例),则调用组件提供的缓存管理器来创建所有缓存,而不管我如何构造代码。这是因为项目没有提供任何自己的缓存管理器吗?

不可能在不涉及项目的情况下在库提供的服务中使用这样的缓存吗?对于用例来说,库能够在不干扰项目缓存的情况下提供缓存是非常重要的.

示例服务缓存配置:

代码语言:javascript
复制
@Configuration
public class SpringAceClientCacheConfiguration
{
    @Bean
    public CacheManager serviceCacheManager()
    {
        return new GuavaCacheManager("service-data") {
            @Override
            public Cache getCache(String name) {
                Logger.getLogger(getClass().getName()).info("Creating new cache for " + name + "...");
                return new GuavaCache(name, CacheBuilder.newBuilder().build());
            }
        };
    }
}

示例项目application.properties:

代码语言:javascript
复制
spring.cache.jcache.config=ehcache3.xml

示例项目ehcache3.xml:

代码语言:javascript
复制
<config xmlns='http://www.ehcache.org/v3'
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:jsr107="http://www.ehcache.org/v3/jsr107"
        xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd
                            http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.0.xsd">

  <cache alias="content">
    <heap unit="entries">4096</heap>
    <jsr107:mbeans enable-statistics="true"/>
  </cache>
</config>

我看到了对“服务-数据”和“内容”缓存的日志记录调用。服务缓存配置只关心它自己的服务数据缓存。我不应该只为这个缓存提供一个缓存管理器,而不必为项目声明一个单独的带有@Primary的缓存管理器(我认为这可能有效,但我还没有尝试)吗?

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2017-09-25 12:49:06

没有“限定”CacheManager的概念,所以当您使用注释模型时,您需要提供一个CacheManager bean来管理完整的缓存基础设施。

但是,缓存抽象有一个CacheResolver SPI。因此,第三方库可能需要一个:

代码语言:javascript
复制
@Cacheable(cacheResolver = "requiredCacheResolver")
public Foo someMethod(String id)

然后,requiredCacheResolver bean可以从您喜欢的任何CacheManager获取缓存信息。第三方库可以提供一个以CacheManager或单个缓存作为参数的实现。

不过,我不知道我是否会建议这样做。如果在第三方库中使用缓存,则应该在文档中定义所需的缓存(名称和语义,以便相应地配置过期)。然后,库的每个用户都应该在其基础结构中配置这些缓存。最后,您必须这样做,而对用户隐藏这一点似乎不是一个好主意。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46402797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档