在Spring中使用MyBatis的Mapper接口自动生成时用┅个自定义的注解标记在Mapper接口的方法中,再利用@Aspect定义一个切面拦截这个注解以记录日志或者执行时长。但是惊奇的发现这样做之后在Spring Boot puteCacheOperations
看似不受影响,其实是做了兼容
可以参考后面的内容,有提到Spring相关的issue
如何解决这个问题呢答案是在Spring Boot 1.X中没有解决方案。因为这个类太基础了,除非切换版本
使用其他Aspect表达式也可以解决此问题,使用注解方式在1.X版本是无解的
本来以为在注解Demo中加入@Inherited可解决的,结果发现鈈行因为这个@Inherited只在类注解有效,在接口中或者方法上都是不能被子类或者实现类继承的,看这个@Inherited上面的注释
* 上面这句话说明了只在父類上的注解可被继承接口上的都是无效的
问题及可能的影响范围已经详细分析完了,下面我们好奇一下这个核心问题类AopUtils.java的提交记录中,作者有写什么吗
查看这个类的历史记录注意Commits on Apr 3, 2018这个日期的,其中提到:
这个issue详细描述了这次提交的原因及目的
读者感兴趣的话可以详細的阅读。
注意AopUtils.java的最新提交又做了一些优化,可以研究一下
上面的示例代码依赖于数据库,现做一个模拟Mapper类的改进可以直接无任何依赖的重现该问题:
// 调用下面的方法生成代理实例
清楚原理之后,我们对上面的实例做下改造把Mybatis的引用简化。
上面的代码可达到与Mapper同样嘚效果大家可以本地随便玩哈。