中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring?@Cacheable注解類內部調用失效的解決方法

發布時間:2022-01-04 00:30:07 來源:億速云 閱讀:410 作者:柒染 欄目:開發技術

這期內容當中小編將會給大家帶來有關Spring @Cacheable注解類內部調用失效的解決方法,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

@Cacheable注解類內部調用失效

如果你只是想使用一個輕量級的緩存方案,那么可以嘗試使用Spring cache方案。

那么在使用spring @Cacheable注解的時候,要注意,如果類A的方法f()被標注了@Cacheable注解,那么當類A的其他方法,例如:f2(),去直接調用f()的時候,@Cacheable是不起作用的,原因是@Cacheable是基于spring aop代理類,f2()屬于內部方法,直接調用f()時,是不走代理的。

舉個例子:

@Cacheable(key = "#entityType", value = "xxxCache")
    public List<String selectByEntityType(intentityType) {
        List<String> result = new ArrayList<>();
        //do something
        return result;
    }
public List<String> f2(){
  //Cacheable失效,不會走緩存的
  selectByEntityType(1);
}

可以把selectByEntityType方法抽取到另外的類中,例如:

@Service
public class CacheService{
@Cacheable(key = "#entityType", value = "xxxCache")
    public List<String selectByEntityType(intentityType) {
        List<String> result = new ArrayList<>();
        //do something
        return result;
    }
}

這樣其他類要使用selectByEntityType方法,只能注入CacheService,走代理。

@Cacheable注解緩存方法內部調用

因為Spring Cache是基于切面的(基于AOP的動態代理實現的:即都在方法調用前后去獲取方法的名稱、參數、返回值,然后根據方法名稱、參數生成緩存的key(自定義的key例外),進行緩存),所以內部方法調用不會調用切面,導致緩存不生效

方法一

暴露Aop代理到ThreadLocal支持,在類之前加@EnableAspectJAutoProxy(exposeProxy = true)

調用的時候使用((XxxService) AopContext.currentProxy()).method()調用方法

eg:

ApiBaseResponse<ApiPageResponse<RoadCongestIndexData>> apiPageResponseApiBaseResponse =
                ((RoadLastPageServiceImpl) AopContext.currentProxy()).queryLastPageCongestIndexData1(request);

方法二

把需要用緩存的方法單獨寫到一個類里面,把內部調用變成類間調用

RoadLastPageServiceImpl selfService = SpringContextUtil.getBean(RoadLastPageServiceImpl.class);
        selfService.queryLastPageCongestIndexData1(request);

方法三

類自我注入,使用@lazy和@Autowired注解實現自我注入,然后使用時用注解的實例代替this調用方法。

@Lazy
@Autowired
private RoadLastPageServiceImpl serviceImplCache;

方法四

寫一個工具類,使用內部調用的時候,自己實例化一個對象,讓類走AOP

@Component
public class SpringContextUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext;
    /**
     * 實現ApplicationContextAware接口的回調方法,設置上下文環境
     *
     * @param applicationContext
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
    /**
     * 獲取對象
     *
     * @param name
     * @return Object
     * @throws BeansException
     */
    public static Object getBean(String name) throws BeansException {
        return applicationContext.getBean(name);
    }
    /**
     * 通過類型獲取對象
     *
     * @param t
     *            對象類型
     * @return
     * @throws BeansException
     */
    public static <T> T getBean(Class<T> t) throws BeansException {
        return applicationContext.getBean(t);
    }
}

調用的時候這么調用

RoadLastPageServiceImpl selfService = SpringContextUtil.getBean(RoadLastPageServiceImpl.class);
selfService.queryLastPageCongestIndexData1(request);

上述就是小編為大家分享的Spring @Cacheable注解類內部調用失效的解決方法了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临潭县| 故城县| 达日县| 安徽省| 莆田市| 黔西| 龙南县| 札达县| 望奎县| 太谷县| 肥乡县| 辽阳市| 偃师市| 临沭县| 博罗县| 大渡口区| 南通市| 铜鼓县| 汕头市| 扎囊县| 华宁县| 唐山市| 囊谦县| 平安县| 岳阳市| 榆社县| 萨嘎县| 泰顺县| 泸定县| 芒康县| 磐石市| 雅江县| 涞水县| 枣庄市| 绥江县| 土默特右旗| 磴口县| 三原县| 丰原市| 泗洪县| 宁陵县|