您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關Spring @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,走代理。
因為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注解類內部調用失效的解決方法了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。