簡體   English   中英

春季緩存僅在某些時候有效

[英]Spring caching works only sometimes

我有一個Spring控制器,想緩存響應。 當我將@Cacheable注釋從getBooks移到doGetBooks方法時,緩存將停止。 一旦將其移回getBooks方法,緩存將再次起作用。 為什么會這樣,我該如何解決?

這將緩存公共方法響應

@GetMapping
@Cacheable(value = "cache", key = "{ #root.methodName }")
public Books getBooks(@RequestHeader(value = "user-agent", required = false) String userAgent) throws Exception {
     if(valid) {
          return this.doGetBooks();
     }
     throw new Exception();
}


public Books doGetBooks() throws Exception{
    ...

這將永遠不會緩存私有方法響應

@GetMapping
public Books getBooks(@RequestHeader(value = "user-agent", required = false) String userAgent) throws Exception {
     if(valid) {
          return this.getBooks();
     }
     throw new Exception();
}


@Cacheable(value = "cache", key = "{ #root.methodName }")
public Books doGetBooks() throws Exception{
    ...

問題:您在同一類中調用doGetBooks(),並且Spring緩存需要AOP代理到被調用的方法。

這是一個很好的討論,描述了Spring AOP為什么不能攔截其他類方法調用的方法 :方法中的AOP調​​用方法

至少有三種解決方法:

  1. 重構代碼:將doGetBooks()移至另一個@Component,並使用該(注入的)bean(refactoredBean.doGetBooks())調用該方法。
  2. 創建對調用調用的服務的自引用(通過@Autowired private MyService myservice並調用myservice.doGetBooks()。
  3. 使用ApplicationContext強制轉換服務bean,並在該bean上調用方法。

一旦調用了Spring Cache可以攔截(通過AOP)的方法,那么@Cacheable()批注就應該觸發。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM