最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?@Cacheable注解類內(nèi)部調(diào)用失效的解決方案

 更新時(shí)間:2022年01月03日 10:22:50   作者:Sam_Deep_Thinking  
這篇文章主要介紹了Spring?@Cacheable注解類內(nèi)部調(diào)用失效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

@Cacheable注解類內(nèi)部調(diào)用失效

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

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

舉個(gè)例子:

@Cacheable(key = "#entityType", value = "xxxCache")
? ? public List<String selectByEntityType(intentityType) {
? ? ? ? List<String> result = new ArrayList<>();
? ? ? ? //do something
? ? ? ? return result;
? ? }
public List<String> f2(){
? //Cacheable失效,不會(huì)走緩存的
? 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注解緩存方法內(nèi)部調(diào)用

因?yàn)镾pring Cache是基于切面的(基于AOP的動(dòng)態(tài)代理實(shí)現(xiàn)的:即都在方法調(diào)用前后去獲取方法的名稱、參數(shù)、返回值,然后根據(jù)方法名稱、參數(shù)生成緩存的key(自定義的key例外),進(jìn)行緩存),所以內(nèi)部方法調(diào)用不會(huì)調(diào)用切面,導(dǎo)致緩存不生效

方法一

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

調(diào)用的時(shí)候使用((XxxService) AopContext.currentProxy()).method()調(diào)用方法

eg:

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

方法二

把需要用緩存的方法單獨(dú)寫(xiě)到一個(gè)類里面,把內(nèi)部調(diào)用變成類間調(diào)用

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

方法三

類自我注入,使用@lazy和@Autowired注解實(shí)現(xiàn)自我注入,然后使用時(shí)用注解的實(shí)例代替this調(diào)用方法。

@Lazy
@Autowired
private RoadLastPageServiceImpl serviceImplCache;

方法四

寫(xiě)一個(gè)工具類,使用內(nèi)部調(diào)用的時(shí)候,自己實(shí)例化一個(gè)對(duì)象,讓類走AOP

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

調(diào)用的時(shí)候這么調(diào)用

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

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java8之lambda表達(dá)式基本語(yǔ)法

    Java8之lambda表達(dá)式基本語(yǔ)法

    本文通過(guò)示例大家給大家介紹了java8之lambda表達(dá)式的基本語(yǔ)法,感興趣的的朋友一起看看吧
    2017-08-08
  • Maven?Pom?文件中的隱式依賴導(dǎo)致Jar沖突問(wèn)題

    Maven?Pom?文件中的隱式依賴導(dǎo)致Jar沖突問(wèn)題

    這篇文章主要介紹了Maven?Pom?文件中的隱式依賴導(dǎo)致Jar沖突問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot中使用Cookie實(shí)現(xiàn)記住登錄的示例代碼

    SpringBoot中使用Cookie實(shí)現(xiàn)記住登錄的示例代碼

    這篇文章主要介紹了SpringBoot中使用Cookie實(shí)現(xiàn)記住登錄的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • java中l(wèi)ist的用法和實(shí)例講解

    java中l(wèi)ist的用法和實(shí)例講解

    這篇文章主要介紹了java中l(wèi)ist的用法和實(shí)例講解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 詳解Spring Security 中的四種權(quán)限控制方式

    詳解Spring Security 中的四種權(quán)限控制方式

    這篇文章主要介紹了詳解Spring Security 中的四種權(quán)限控制方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java之哈夫曼壓縮原理案例講解

    Java之哈夫曼壓縮原理案例講解

    這篇文章主要介紹了Java之哈夫曼壓縮原理案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 解決mapstruct在eclipse生成不了mapper的實(shí)現(xiàn)類問(wèn)題

    解決mapstruct在eclipse生成不了mapper的實(shí)現(xiàn)類問(wèn)題

    這篇文章主要介紹了解決mapstruct在eclipse生成不了mapper的實(shí)現(xiàn)類問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • java 實(shí)現(xiàn)文件編碼檢測(cè)的幾種方式匯總

    java 實(shí)現(xiàn)文件編碼檢測(cè)的幾種方式匯總

    在實(shí)際開(kāi)發(fā)中,我們常常涉及某些場(chǎng)景需要對(duì)文件的讀取,但是因?yàn)椴恢谰唧w的編碼格式,導(dǎo)致讀取到的文件內(nèi)容亂碼,因此在讀取文件內(nèi)容之前,需要解析獲取文件的編碼,這樣讀取的內(nèi)容就不會(huì)出現(xiàn)亂碼了,下面是常見(jiàn)的幾種獲取文件編碼的方式,感興趣的朋友一起看看吧
    2025-09-09
  • 學(xué)習(xí)Java之Java中的異常處理機(jī)制詳解

    學(xué)習(xí)Java之Java中的異常處理機(jī)制詳解

    在本文中,小編將帶領(lǐng)大家來(lái)學(xué)習(xí)Java的異常處理機(jī)制,包括異常機(jī)制、異常類型、如何捕獲異常、如何拋出異常以及如何創(chuàng)建自定義異常等核心內(nèi)容,感興趣的同學(xué)跟著小編一起來(lái)看看吧
    2023-08-08
  • 深入探究Java線程的創(chuàng)建與構(gòu)造方法

    深入探究Java線程的創(chuàng)建與構(gòu)造方法

    這篇文章主要給大家分享的是java線程的創(chuàng)建以及構(gòu)造方法,想了解具體方式的小伙伴可以參考下面文章內(nèi)容,希望對(duì)你有所幫助
    2022-04-04

最新評(píng)論

巴里| 罗定市| 梅州市| 枣阳市| 日喀则市| 炉霍县| 泰安市| 松原市| 南江县| 普宁市| 黄浦区| 长沙县| 吉木乃县| 光泽县| 浦北县| 革吉县| 博乐市| 宁国市| 竹溪县| 岳阳县| 瑞昌市| 灵山县| 武平县| 阳城县| 泽州县| 元阳县| 乐都县| 庆城县| 贵州省| 陆河县| 磴口县| 高雄县| 伽师县| 安宁市| 岳阳市| 保定市| 阿克陶县| 哈巴河县| 益阳市| 鲜城| 聂荣县|