假设您创建了一个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的缓存管理器(我认为这可能有效,但我还没有尝试)吗?
谢谢你的帮助!
发布于 2017-09-25 12:49:06
没有“限定”CacheManager的概念,所以当您使用注释模型时,您需要提供一个CacheManager bean来管理完整的缓存基础设施。
但是,缓存抽象有一个CacheResolver SPI。因此,第三方库可能需要一个:
@Cacheable(cacheResolver = "requiredCacheResolver")
public Foo someMethod(String id)然后,requiredCacheResolver bean可以从您喜欢的任何CacheManager获取缓存信息。第三方库可以提供一个以CacheManager或单个缓存作为参数的实现。
不过,我不知道我是否会建议这样做。如果在第三方库中使用缓存,则应该在文档中定义所需的缓存(名称和语义,以便相应地配置过期)。然后,库的每个用户都应该在其基础结构中配置这些缓存。最后,您必须这样做,而对用户隐藏这一点似乎不是一个好主意。
https://stackoverflow.com/questions/46402797
复制相似问题