Spring Boot根据请求禁用@Cacheable

时间:2017-05-19 21:30:39

标签: java spring caching spring-boot spring-cache

我正在尝试根据URL参数禁用Spring Boot中的Cacheable函数。例如http://myapplication.com/some/request?cache=false

我用SpEL尝试了这个条件,但是我无法让它工作

@Cacheable(value = "value", keyGenerator = "keygenerator", condition = "#{someComponent.isCacheEnabled()}")

有什么建议吗?提前谢谢!

1 个答案:

答案 0 :(得分:0)

user4843 -

我假设你的"任意组件" (即someComponent)是 Spring ApplicationContext中的 Spring 托管bean?

如果是这样,那么您没有使用condition注释声明中@Cacheable属性上指定的SpEL表达式正确引用此 Spring 托管bean。它应该是......

condition="#{@someComponent.isCacheEnabled()}"

请注意在@上使用someComponent符号,详细说明here。而且,虽然 Spring documentation在这个问题上不太明确,但它确实暗示了在 Spring的缓存抽象中创建和使用的SpEL评估上下文处理缓存注释时使用"内置参数"或SpEL conventions,以及表36.1 - 缓存SpEL可用元数据中列出的参数。请参阅示例here

我还要提醒您使用某些任意组件或 Spring 托管bean来管理整个应用程序的缓存状态。

  1. 首先,如果someComponent Singleton bean( Spring 容器中的默认值),则此bean需要是线程安全的,特别是当它的状态正在发生变化时,可能看似每个HTTP请求,这导致我...

  2. 我不确定您是否希望 Spring 托管bean管理"可缓存状态"如果缓存状态是以每个单独的HTTP请求为条件的,那么应用程序服务/存储库方法的大小,特别是因为大多数HTTP容器在单独的线程中处理每个HTTP请求。你肯定会遇到竞争条件。在这种情况下,我宁愿使用额外的可缓存服务方法参数来确定源自HTTP请求的特定服务方法调用的可缓存状态。

  3. 示例:

    @Cacheable(value = "value", keyGenerator="keyGenerator" conditional="#enableCaching")
    public <return-type> someCacheableServiceMethod(..., boolean enableCaching) {
      ...
    }
    

    事实上,我甚至建议使用更易理解的面向业务的规则来确定服务方法的可缓存状态。

    希望这有帮助!

    -John