由于项目需要使用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. php 快排

    <?php $arr =array(3,1,5,67,8,7,9,9); function qsort(&$arr,$head,$tail){ if($head>=$tail){ ...

  2. Service工作过程

    Service两种工作状态的作用 1)启动状态:用于执行后台计算 2)绑定状态:用于其他组件和Service的交互 注意:Service这两种状态可以共存,即Service既可以处于启动状态也可以同时 ...

  3. JS-随机生成的密码

    randPassword(size) =>{ //数组 let seed = new Array('A','B','C','D','E','F','G','H','I','J','K','L', ...

  4. sizeof计算空间大小的总结

    sizeof,看起来还真不简单,总结起来还是一大堆的东西,不过这是笔试面试中出现比较频繁的,我也是考过才觉得很重要,有些规则如果不注意,还真是拿到一道题目摸不着头脑,所有总结一下,方面忘记的时候瞄一瞄 ...

  5. MySQL高级学习笔记

    1. 变量相关 临时变量 -- 定义在函数体或存储过程中的变量 -- 用法在讲函数时会提到 用户变量,也称会话变量 -- 用户变量只对当前连接用户有效,其他连接用户无法访问 -- 使用 @ 标识符声明 ...

  6. java中servletContextListener、httpSessionListener和servletRequestListener使用整理

    在java web应用中,listener监听器似乎是必不可少的,常常用来监听servletContext.httpSession.servletRequest等域对象的创建.销毁以及属性的变化等等, ...

  7. yii学习笔记--配置文件的配置

    'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..', 'name'=>'My Web Application',//项目的名称 / ...

  8. Stanford Word Segmenter使用

    1,下载 Stanford Word Segmenter软件包: Download Stanford Word Segmenter version 2014-06-16 2,在eclipse上建立一个 ...

  9. Hibernate中的条件查询完成类

    Hibernate中的条件查询有以下三个类完成: 1.Criteria:代表一次查询 2.Criterion:代表一个查询条件 3.Restrictions:产生查询条件的工具类

  10. Linux显示服务器完整的状态信息

    Linux显示服务器完整的状态信息 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ apachectl [fullstatus] Usage: /usr/sbi ...