Spring Cache按cacheName配置禁用缓存

Spring Cache按cacheName配置禁用缓存,spring,spring-cache,Spring,Spring Cache,我使用SpringBoot,很容易将SpringCache与其他缓存组件集成 通过缓存数据,我们可以使用@Cachable注释,但我们仍然需要配置cacheName并将其添加到cacheManager,如果不执行此步骤,我们将在访问该方法时出现异常: java.lang.IllegalArgumentException:找不到生成器名为“xxxx”的缓存 我的问题是,如果我们不配置cacheName,是否能够禁用缓存而不是引发错误?我提出这个问题是因为SpringCache在CachePro

我使用SpringBoot,很容易将SpringCache与其他缓存组件集成

通过缓存数据,我们可以使用
@Cachable
注释,但我们仍然需要配置cacheName并将其添加到
cacheManager
,如果不执行此步骤,我们将在访问该方法时出现异常:


java.lang.IllegalArgumentException:找不到生成器名为“xxxx”的缓存

我的问题是,如果我们不配置
cacheName
,是否能够禁用缓存而不是引发错误?我提出这个问题是因为SpringCache在
CacheProperties
中提供了一个配置
spring.cache.cacheNames

不确定
@cacable
中的
条件
属性是否适用于此

任何想法都是非常感谢的!!提前谢谢

这实际上取决于您的“缓存提供程序”,尤其是接口的实现。由于Spring只是一个“抽象”,它允许您插入不同的提供者和后端数据存储,以支持应用程序所需的缓存(即,由Spring的缓存注释或JSR-107-JCache注释确定;请参阅)

例如,如果要使用Spring框架提供的实现(除了非常简单的UCs外,不建议用于生产),那么如果选择在配置/初始化时声明缓存(使用),则会延迟创建“
缓存”。但是,如果您确实在配置/初始化时声明了“
缓存”
”(使用),那么如果您的应用程序使用未明确声明的缓存(例如
@Cacheable(“不存在缓存”)
),然后将引发异常,因为该方法将返回
null
,并且
CacheInterceptor
初始化逻辑将为no
Cache
提供用于缓存操作的初始化逻辑(从
CacheIntercepter
向下,然后)

目前无法对不存在的缓存禁用此初始化检查(即抛出异常)。您所能做的最好的事情就是,像
ConcurrentMapCacheManager
实现一样,惰性地创建
缓存
。但是,这在很大程度上取决于缓存提供程序实现。显然,某些缓存提供程序比其他缓存提供程序更复杂,动态(即延迟)创建
缓存可能更昂贵,因此缓存提供程序不支持或不建议这样做

不过,您可以通过包装任何
CacheManager
实现(由您选择)来绕过此限制,并将“现有的”
Caches
和“安全地”处理“不存在的”委托给底层实现
CacheManager
Cache
接口的一些简单包装器实现将其视为缓存未命中,从而实现缓存

下面是一个演示您当前问题的示例。请注意,对于不存在的
缓存

然后,下面是一个示例,演示如何有效地禁用不存在的
缓存的缓存(缓存提供程序未提供)。再次请注意安全访问不存在的
缓存

这可以通过for
CacheManager
(它包装并委托给现有的缓存提供程序,在本例中,它只是
ConcurrentMapCacheManager
(请参阅),但可以用于Spring缓存抽象支持的任何缓存提供程序)以及Spring
Cache
接口。如果您不关心名称,则此no op
缓存
实例可以是一个单例,并可用于所有不存在的
缓存
。但是,它会让您在一定程度上了解“命名的”
缓存
未配置实际的
缓存
,因为这很可能会对您的服务产生影响(即,由于“命名的”缓存不存在而未启用缓存的服务方法)

无论如何,这可能不是你想要的,我甚至警告你,如果你把它推到生产环境中,要特别小心,因为(我认为)它确实应该因为缺少
缓存而快速失效,但这确实实现了你想要的

显然,它是可配置的,您可以根据缓存名称或其他条件对其进行条件化,如果您真的不关心或不希望在某些上下文中对某些服务方法进行缓存,那么这取决于您,并且这种方法是灵活的,完全可以根据需要为您提供选择

希望这能给你一些想法。

这真的取决于你的“缓存提供程序”和接口的实现,尤其是。由于Spring只是一个“抽象”,它允许您插入不同的提供者和后端数据存储,以支持应用程序所需的缓存(即,由Spring的缓存注释或JSR-107-JCache注释确定;请参阅)

例如,如果要使用Spring框架提供的实现(除了非常简单的UCs外,不建议用于生产),那么如果选择在配置/初始化时声明缓存(使用),则会延迟创建“
缓存”。但是,如果您确实在配置/初始化时声明了“
缓存”
”(使用),那么如果您的应用程序使用未明确声明的缓存(例如
@Cacheable(“不存在缓存”)
),然后将引发异常,因为该方法将返回
null
,并且
CacheInterceptor
初始化逻辑将为no
Cache
提供用于缓存操作的初始化逻辑(从
CacheIntercepter
向下、和