由于项目需要使用SpringCache来做一点缓存,但自己之前没有使用过(其实是没有听过)SpringCache,于是,必须先学习之。

在网上找到一篇文章,比较好,就先学习了,地址是:

https://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/

在此感谢原博主的无私奉献~~谢谢~~

一口气看下来,其实也容易理解、不算难。同时,自己的个人习惯是把其中的代码Copy出来,Paste到Idea中调试并运行,同时,也把代码提交到Github。于是,对于SpringCache,又在Github上创建了一个Repository,地址是:

https://github.com/cyhbyw/springCache

Demo很快学习完成。几天后,项目中也使用上了相应代码。一切看起来都那么顺利,直到……

直到有一天,自己测试的时候,发现缓存的方法并没有生效,方法还是照样被调用了、照样去DB中取数据而不是从缓存中取。

于是,寻找RootCause。

再回头去看那篇文章,里面写得很清楚,如下图:

显然,就是在同一个类中,MethodA 调用了 MethodB,那么 MethodB 上面的 @Cacheable 注释就会失效!

而解决办法,人家也说了,如下图:

就是:SpringAOP 无法解决,需要使用 AspectJ 来解决!

那么,接下来的问题就是:如何从 SpringAOP 切换到 AspectJ 呢?

百度了一大堆,最后找到的解决办法如下:

第一步:

SpringCache默认的 mode = proxy,需要将其设置为 mode = aspectj,如下图所示

那这个 mode 到底是个什么意思呢?查看 XSD 文件,说明如下:

简单翻译如下:被注解的Bean到底是使用SpringAOP还是AspectJ来代理?AspectJ代理需要在ClassPath中添加 spring-aspects.jar,同时启用加载期织入(load-time weaving)或者编译期织入 (compile-time weaving)。同时,注解只能作用于类上。接口上将不生效。

所以,将 mode = proxy 改为 mode = aspectj 就是自然的了。

第二步:

完成上面翻译内容所需要的动作。

2.1步:在 POM 中加入 spring-aspects.jar

2.2步:在 POM 中添加插件以开户 编译期织入 功能,此插件内容截图如下

再次测试,MethodB 中的 @Cacheable 已经生效!

最后,再次奉献自己的 Github 地址:

https://github.com/cyhbyw/springCache

工程名:ibmSpringCache

解决此问题的提交记录:

SpringCache @Cacheable 在同一个类中调用方法,导致缓存不生效的问题及解决办法的更多相关文章

  1. Spring @Cacheable注解 && 事务@Transactional 在同一个类中的方法调用不生效

    @Cacheable 注解在对象内部调用不会生效 代码示例:ProductServiceImpl.java public List<ProductInfoVO> getProductLis ...

  2. 分析spring事务@Transactional注解在同一个类中的方法之间调用不生效的原因及解决方案

    问题: 在Spring管理的项目中,方法A使用了Transactional注解,试图实现事务性.但当同一个class中的方法B调用方法A时,会发现方法A中的异常不再导致回滚,也即事务失效了. 当这个方 ...

  3. java中方法内可以调用同一个类中的方法

    在同一个类中,java的普通方法的相互调用,可以使用this+点号+方法名,也可省略this+点号,java编 译器会自动补上.

  4. Spring事务:调用同一个类中的方法

    问题: 如果同一个类中有方法:methodA(); methodB().methodA()没有开启事务,methodB()开启了事务 且methodA()会调用methodB(). 那么,method ...

  5. 梳理:python—同一个类中的方法调用

    为什么突然在此提到这个梳理问题呢? 因为在自己实践综合练习学过的知识时,突然觉得有些知识点的运用总是不成功,于是翻过课本进行回顾,总是觉得是对的,可是当再进一步思考“既然是对的,为什么在程序中总是不成 ...

  6. spring 事务处理中,同一个类中:A方法(无事务)调B方法(有事务),事务不生效问题

    public class MyEntry implements IBaseService{ public String A(String jsonStr) throws Exception{ User ...

  7. [BUG] python实例化N次类,调用类函数log会输出N遍的bug 解决办法

    最近再写DOU用例时,采用的是 unittest测试框架,就涉及到将其它所有模块需要全部在一个 .py文件中进行实例化,然后再运行时发现在控制台中同一个日志信息会打印多次(实例化几次,同一消息就会打印 ...

  8. discuz x3在DIY模块中调用伪静态不成功,显示动态链接的解决办法

    discuz x3在DIY模块中调用伪静态不成功,显示动态链接,然而其他的链接正常显示伪静态. 后台启用伪静态后,发现论坛版块.帖子点击链接,伪静态正常显示,然后在门户首页DIY显示的帖子,点进去后发 ...

  9. Mybatis中实体类中的字段跟对应表的字段不一致时解决办法

    解决字段名与实体类属性名不相同的冲突 实体类字段: public class Order { private int id; private String orderNo; private float ...

随机推荐

  1. Java.lang.Comparable接口和Java.util.Comparator接口的区别

    Java的Comparator和Comparable当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. 1.Com ...

  2. day4(while 、练习题)

    一.while ... else 方法 while else 的作用就是,确定循环正确执行完毕,else里面可以提示完成的情况. 二.练习题 1.编译型语言是编译完之后执行,解释性语言是边编译边执行, ...

  3. TCP/IP三次握手四次挥手

    本文通过图来梳理TCP-IP协议相关知识.TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道.如图所示,给出了TCP通信过程的示意图. TCP 三次握手四次挥手 主要包括三部 ...

  4. SPFA+SLF+LLL优化模板

    #include<algorithm> #include <iostream> #include <cstdlib> #include <cstring> ...

  5. linux之hdparm命令说明及其测试硬盘读写速度

    hdparm -t /dev/sda1功能说明:显示与设定硬盘的参数. 语 法:hdparm [-CfghiIqtTvyYZ] [-a <快取分区>][-A <0或1>][-c ...

  6. Hi3531用SPI FLASH启动 使用Nand做文件系统

    1.编译内核(可选) make ARCH=arm CROSS_COMPILE=arm-hisiv200-linux- menuconfig make ARCH=arm CROSS_COMPILE=ar ...

  7. HI3531uboot开机画面

    startvo 0 36 13; startgx 0 0x88000000 1600 0 0 800 600; //startgx 0 0x88000000 2048 0 0 1024 768; se ...

  8. 【php】strtr与str_replace的区别

    strtr(string,from,to): 逐个字符开始替换,以from跟to中长度较较短的一个为准,例如: strtr("aidenliu","ai",&q ...

  9. FusionWidgets Bulb图

    1.数据源提供 Bulb.xml: <?xml version="1.0" encoding="UTF-8"?> <chart lowerLi ...

  10. Java求素数时出现错误

    Java求素数时出现错误 1.具体错误如下 No enclosing instance of type Prime is accessible. Must qualify the allocation ...