想象一下,您创建了一个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());
}
};
}
}
spring.cache.jcache.config=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声明一个单独的缓存管理器(我相信可能工作,但我还没有尝试过它)?
感谢您的帮助!
答案 0 :(得分:1)
没有立即认可的&#34;合格&#34; CacheManager
因此,当您使用注释模型时,您需要提供一个管理完整缓存基础结构的CacheManager
bean。
但是,缓存抽象具有CacheResolver
SPI。所以,你的第三方lib可能需要一个:
@Cacheable(cacheResolver = "requiredCacheResolver")
public Foo someMethod(String id)
然后requiredCacheResolver
bean可以从您喜欢的任何CacheManager
获取缓存信息。第三方lib可以提供一个以CacheManager
或单个缓存作为参数的实现。