1

想象一下,您创建了一个 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>

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

谢谢你的帮助!

4

1 回答 1

2

没有直接的“合格”概念,CacheManager因此当您使用注释模型时,您需要提供一个CacheManagerbean 来管理您的完整缓存基础结构。

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

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

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

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

于 2017-09-25T12:49:06.800 回答