Cacheable註解不生效原因

2021-09-06 13:24:10 字數 1367 閱讀 8882

@cacheable註解中:

乙個方法a調同乙個類裡的另乙個有快取註解的方法b,這樣是不走快取的。

例如在同乙個service裡面兩個方法的呼叫,快取是不生效的;

解決方案:

1.不使用註解的方式,直接取 ehcache 的 cachemanger 物件,把需要快取的資料放到裡面,類似於使用 map,快取的邏輯自己控制;或者可以使用redis的快取方式去新增快取;

2.把方法a和方法b放到兩個不同的類裡面,例如:如果兩個方法都在同乙個service介面裡,把方法b放到另乙個service裡面,這樣在a方法裡調b方法,就可以使用b方法的快取。

原理:

// get 方法呼叫了 stockgive 方法,stockgive 方法使用了快取

// 但是每次執行get 方法的時候,快取都沒有生成,也就是快取沒有被建立

public void get()

@override

@cacheable(value = cacheconfig.common, key = "'stock/give'+#memberid")

public list> stockgive(long memberid)

為什麼快取沒有被正常建立??

因為@cacheable 是使用aop **實現的 ,通過建立內部類來**快取方法,這樣就會導致乙個問題,類內部的方法呼叫類內部的快取方法不會走**,不會走**,就不能正常建立快取,所以每次都需要去呼叫資料庫。

@cacheable 的一些注意點

1、因為@cacheable 由aop 實現,所以,如果該方法被其它註解切入,當快取命中的時候,則其它註解不能正常切入並執行,@before 也不行,當快取沒有命中的時候,其它註解可以正常工作

2、@cacheable 方法不能進行內部呼叫,否則快取無法建立

@cacheable標註的方法,如果其所在的類實現了某乙個介面,那麼該方法也必須出現在介面裡面,否則cache無效。

具體的原因是, spring把實現類裝載成為bean的時候,會用**包裝一下,所以從spring bean的角度看,只有介面裡面的方法是可見的,其它的都隱藏了,自然課看不到實現類裡面的非介面方法,@cacheable不起作用。

解決辦法:把待cache的方法移到介面裡面。

另外衍生兩個小問題:

1. @cacheable放介面裡面可以嗎?答案是:不行。

2. 如果某乙個bean並沒有實現任何介面,@cacheable標註的方法有什麼要求?

答案是public即可。這種bean也被spring產生了**, 看得到的只有public方法。

本質是spring**的問題,很多的基礎設施可能都會遇到類似的問題。比如安全,事務,日誌等等。

Cacheable不生效的原因 方法內呼叫

乙個類中有方法a和方法b,呼叫方法a時,每次都會呼叫資料庫。和期望不符。方法a public manager info 方法b cacheable key id public manager info long id spring 快取註解是基於spring aop切面,必須走 才能生效,同類呼叫或...

shiro註解不生效(表象)

連續被折磨三天,shiro的 requirespermissions註解就是感覺不到生效,找各種博文 帖子也解決不了,最後逼著對shiro斷點觀察,終於找到問題根源.在網上找資料,一般註解不生效,主要有兩個原因 1 沒有啟用shiro註解功能。而啟用該功能主要有如下兩種方式 使用 使用default...

spring 註解aop不生效

首先基礎要理解spring配置檔案和springmvc配置檔案 spring註解不生效可從以下幾個方面找原因 1 springmvc的配置檔案中只配置掃瞄 controller的註解,spring的配置檔案掃瞄除了 controller的註解的其他的註解 2 檢查 pointcut 的表示式是否正確...