Spring@Cacheable注解在类内部调用失效的问题
如图所示,getRecomendGoogs方法里面调用findImgUrlByName方法,在findImgUrlByName方法上使用@Cacheable注解的时候,并没有走缓存。
要解决这个问题,首先我们需要了解spring缓存的原理。spring cache的实现原理跟spring的事务管理类似,都是基于AOP的动态代理实现的:即都在方法调用前后去获取方法的名称、参数、返回值,然后根据方法名称、参数生成缓存的key(自定义的key例外),进行缓存。debug可以看到调用的实际上是groupUserBiz的代理类,基于cglib动态代理实现。当调用代理的方法时,代理可以整体控制实际的方法的入参和返回值。比如缓存结果,直接跳过执行实际的方法等。
找到了原因之后,我们有两种解决方案
第一种:
把findImgUrlByName这个方法单独写到另外的一个类里面去,把类内部调用改成类之间调用
第二种:
使用内部调用的时候,自己实例化一个类对象,让类走AOP,
写一个工具类
@Component
public class SpringContextUtil implements ApplicationContextAware {// Spring应用上下文环境private static ApplicationContext applicationContext;/*** 实现ApplicationContextAware接口的回调方法,设置上下文环境* * @param applicationContext*/public void setApplicationContext(ApplicationContext applicationContext) {SpringContextUtil.applicationContext = applicationContext;}/*** @return 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);}
}
在getRecomendGoogs方法调用findImgUrlByName的时候使用
WeCommonService weCommonService = SpringContextUtil.getBean(WeCommonService.class);自己实例化service
---------------------
作者:总有刁明想害朕
来源:CSDN
原文:https://blog.csdn.net/Crystalqy/article/details/83541054
版权声明:本文为博主原创文章,转载请附上博文链接!
Spring@Cacheable注解在类内部调用失效的问题相关推荐
- Spring @Import注解配置类方法内部调用没有注入属性值的坑
一.场景复现 application.yaml spring:application:name: config-testprofiles:active: devconfig:config-01:nam ...
- @Transactional类内部访问失效原因详解
一.原理 Spring之所以可以对开启@Transactional的方法进行事务管理,是因为Spring为当前类生成了一个代理类,然后在执行相关方法时,会判断这个方法有没有@Transactional ...
- Spring框架学习笔记03:初探Spring——利用注解配置类取代Spring配置文件
文章目录 一.课程引入 二.利用注解配置类取代Spring配置文件 (一)打开项目[SpringDemo2021] (二)创建net.hw.spring.lesson03包 (三)移植上一讲的接口和类 ...
- SpringCache @Cacheable 在同一个类中调用方法,导致缓存不生效的问题及解决办法...
由于项目需要使用SpringCache来做一点缓存,但自己之前没有使用过(其实是没有听过)SpringCache,于是,必须先学习之. 在网上找到一篇文章,比较好,就先学习了,地址是: https:/ ...
- Spring基于@Configuration的类配置的内部源码实现
概述 Spring容器启动时,即ApplicationContext接口实现类的对象实例执行refresh方法时,主要是通过执行ConfigurationClassPostProcessor这个Bea ...
- (转)Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义
1.从Spring2.0以后的版本中,Spring也引入了基于注解(Annotation)方式的配置,注解(Annotation)是JDK1.5中引入的一个新特性,用于简化Bean的配置,某些场合可以 ...
- 被各种注解搞晕了?那快来看看Spring Bean注解详解!
前言 本篇博客中,我们将会讨论用于声明不同类型 Beans 的几种最常用的 Spring Bean 注解. 众所周知,Spring 容器中有许多配置 Bean 的方法,我们既可以通过 XML 配置,也 ...
- @Configuration注解的类的加载(注意不是处理@Configuration注解处理)实现原理
概述 这里主要分析@Configuration注解的类自身的加载的实现,即生成该类对应的BeanDefinition,注册到BeanFactory,此时该类就跟一个普通使用了如@Component注解 ...
- Spring全部注解
Spring中的注解主要分为两类: 类级别的注解: 如@Component.@Repository.@Controller.@Service以及JavaEE6的@ManagedBean和@Named注 ...
最新文章
- 美国物理超级计算机,美国科学家在物理学的一个分支领域朝着开发超级计算机迈进了一步。这一分支领域研究的是人眼看不见的粒子。...
- python_redis模块
- python写网络调试助手_Qt开源作品4-网络调试助手
- BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)
- 【杭州】Hack for Cloud Beginner微软黑客松大赛
- 资源放送丨《一次特殊的Oralce硬解析性能问题的技术分享》PPT视频
- 墙裂推荐 | 漫画解读Elasticsearch原理,看完你就懂
- spring MVC 项目 WEB-INF下的jsp不能加载css文件
- Microsoft Visual Studio 语言切换
- 基于GLBP协议的医院网络规划与设计 文档+申请表+任务书+开题报告+中期检查+文献综述+PPT+周进展+网络拓扑及配置
- [已解决] idea插件下载不了
- JS代码错误:Deleting local variable in strict mode
- 【量化笔记】量价关系分析
- h5聊天页面 jquery_h5聊天室web端(仿微博、微信)|h5仿微信网页端|仿微信界面弹窗...
- 关于python教学
- 华为4月11号 南研所 面经。(已拿offer)
- Java 3DES加密解密(Commons.Codec Base64)
- 软量子计算机机 铷,陈根:迄今最多量子比特的机器,让量子计算进入全新领域...
- Echarts简单封装
- 29个习惯让你的拖延症一去不复返
热门文章
- 由浅入深,走进Python装饰器-----第五篇:进阶--类装饰类
- INTERSPEECH 2017系列 | 语音识别之语言模型技术
- 如何在 Ubuntu server 中设置 RainLoop Webmail
- Column store index 列数据如何匹配成行数据?
- Java使用PDFBox开发包实现对PDF文档内容编辑与保存
- ucos内存管理笔记
- XenServer中Windows 7与XP多vCPU支持配置
- vim去掉windows文本的多余的回车符(^M)
- tensorflow分布式训练之同步更新和异步更新
- 关于Matlab中符号运算的因式分解、展开与合并