Spring Cache按cacheName配置禁用缓存
我使用SpringBoot,很容易将SpringCache与其他缓存组件集成 通过缓存数据,我们可以使用Spring Cache按cacheName配置禁用缓存,spring,spring-cache,Spring,Spring Cache,我使用SpringBoot,很容易将SpringCache与其他缓存组件集成 通过缓存数据,我们可以使用@Cachable注释,但我们仍然需要配置cacheName并将其添加到cacheManager,如果不执行此步骤,我们将在访问该方法时出现异常: java.lang.IllegalArgumentException:找不到生成器名为“xxxx”的缓存 我的问题是,如果我们不配置cacheName,是否能够禁用缓存而不是引发错误?我提出这个问题是因为SpringCache在CachePro
@Cachable
注释,但我们仍然需要配置cacheName并将其添加到cacheManager
,如果不执行此步骤,我们将在访问该方法时出现异常:
java.lang.IllegalArgumentException:找不到生成器名为“xxxx”的缓存
我的问题是,如果我们不配置cacheName
,是否能够禁用缓存而不是引发错误?我提出这个问题是因为SpringCache在CacheProperties
中提供了一个配置spring.cache.cacheNames
不确定@cacable
中的条件
属性是否适用于此
任何想法都是非常感谢的!!提前谢谢 这实际上取决于您的“缓存提供程序”,尤其是接口的实现。由于Spring只是一个“抽象”,它允许您插入不同的提供者和后端数据存储,以支持应用程序所需的缓存(即,由Spring的缓存注释或JSR-107-JCache注释确定;请参阅)
例如,如果要使用Spring框架提供的实现(除了非常简单的UCs外,不建议用于生产),那么如果选择在配置/初始化时声明缓存(使用),则会延迟创建“缓存”。但是,如果您确实在配置/初始化时声明了“缓存”
”(使用),那么如果您的应用程序使用未明确声明的缓存(例如@Cacheable(“不存在缓存”)
),然后将引发异常,因为该方法将返回null
,并且CacheInterceptor
初始化逻辑将为noCache
提供用于缓存操作的初始化逻辑(从CacheIntercepter
向下,然后)
目前无法对不存在的缓存禁用此初始化检查(即抛出异常)。您所能做的最好的事情就是,像ConcurrentMapCacheManager
实现一样,惰性地创建缓存
。但是,这在很大程度上取决于缓存提供程序实现。显然,某些缓存提供程序比其他缓存提供程序更复杂,动态(即延迟)创建缓存可能更昂贵,因此缓存提供程序不支持或不建议这样做
不过,您可以通过包装任何CacheManager
实现(由您选择)来绕过此限制,并将“现有的”Caches
和“安全地”处理“不存在的”委托给底层实现CacheManager
和Cache
接口的一些简单包装器实现将其视为缓存未命中,从而实现缓存
下面是一个演示您当前问题的示例。请注意,对于不存在的缓存
然后,下面是一个示例,演示如何有效地禁用不存在的缓存的缓存(缓存提供程序未提供)。再次请注意安全访问不存在的缓存
这可以通过forCacheManager
(它包装并委托给现有的缓存提供程序,在本例中,它只是ConcurrentMapCacheManager
(请参阅),但可以用于Spring缓存抽象支持的任何缓存提供程序)以及SpringCache
接口。如果您不关心名称,则此no op缓存
实例可以是一个单例,并可用于所有不存在的缓存
。但是,它会让您在一定程度上了解“命名的”缓存
未配置实际的缓存
,因为这很可能会对您的服务产生影响(即,由于“命名的”缓存不存在而未启用缓存的服务方法)
无论如何,这可能不是你想要的,我甚至警告你,如果你把它推到生产环境中,要特别小心,因为(我认为)它确实应该因为缺少缓存而快速失效,但这确实实现了你想要的
显然,它是可配置的,您可以根据缓存名称或其他条件对其进行条件化,如果您真的不关心或不希望在某些上下文中对某些服务方法进行缓存,那么这取决于您,并且这种方法是灵活的,完全可以根据需要为您提供选择
希望这能给你一些想法。这真的取决于你的“缓存提供程序”和接口的实现,尤其是。由于Spring只是一个“抽象”,它允许您插入不同的提供者和后端数据存储,以支持应用程序所需的缓存(即,由Spring的缓存注释或JSR-107-JCache注释确定;请参阅)
例如,如果要使用Spring框架提供的实现(除了非常简单的UCs外,不建议用于生产),那么如果选择在配置/初始化时声明缓存(使用),则会延迟创建“缓存”。但是,如果您确实在配置/初始化时声明了“缓存”
”(使用),那么如果您的应用程序使用未明确声明的缓存(例如@Cacheable(“不存在缓存”)
),然后将引发异常,因为该方法将返回null
,并且CacheInterceptor
初始化逻辑将为noCache
提供用于缓存操作的初始化逻辑(从CacheIntercepter
向下、和