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

时间:2017-09-25 10:17:20

标签: spring spring-cache ehcache-3

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

我观察的行为是,如果项目使用的是使用简单的application.properties配置的缓存(让我们说ehcache - 请参阅下面的示例),组件提供的缓存管理器将被调用以创建所有缓存,无论我如何构造代码。是否发生这种情况是因为该项目尚未提供任何自己的缓存管理器?

如果不涉及项目,是否可以在库提供的服务中进行这样的缓存?对于用例来说,库可以提供缓存而不会干扰项目缓存,这一点非常重要。

示例服务缓存配置:

@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:

spring.cache.jcache.config=ehcache3.xml

示例项目ehcache3.xml:

<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>

我看到了&#39; service-data&#39;以及&#39;内容&#39;缓存。服务缓存配置仅关注它自己的服务数据缓存。我是否应该只为这个缓存提供一个缓存管理器,而项目不必与@Primary声明一个单独的缓存管理器(我相信可能工作,但我还没有尝试过它)?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

没有立即认可的&#34;合格&#34; CacheManager因此,当您使用注释模型时,您需要提供一个管理完整缓存基础结构的CacheManager bean。

但是,缓存抽象具有CacheResolver SPI。所以,你的第三方lib可能需要一个:

@Cacheable(cacheResolver = "requiredCacheResolver")
public Foo someMethod(String id)

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

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