想象一下,您创建了一个 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 声明一个单独的缓存管理器(我相信这可能有效,但我还没有尝试过),我是否应该不能只为这个缓存提供一个缓存管理器?
谢谢你的帮助!