有时候我们使用两个注解会失效是因为什么? 是因为我们在使用两个注解时,方法内调用的其他方法都是通过this调用的,而注解的原理是基于AOP代理对象实现的,所以你在缓存中看不到想要的结果和事务失效。 我目前解决这个有两种方法: 1、是通过循环依赖解决的,我们在注入一个自己的service对象,通过自己的对象调用自己的方法,而不是this关键字来调用自己的方法
如图,不要看代码内容,我们假设如果place方法需要加事务注解,这两个方法在同一个IOrderCreateService类中,对于placeOrder()方法,我们平常会使用this来调用,但是加注解事务就会失效,就是因为this是指带本类的对象,而不是通过动态代理来实现的,简单来讲,就是没通过spring自动注入,我们就使用自己不过这样需要加一个配置,让spring知道你在使用循环依赖
spring:
main:
# 支持循环依赖注入
allow-circular-references: true
通过加这样的一个配置来解决 @Cacheable也是因为同样原因 2、就是将这个需要加事务的方法拆分成一个新的service接口,让这个类实现它,重写该方法,用新的service自动注入后来调用他,就解决了循环依赖问题,就是要多创建一个接口,有一点麻烦,但是这样的好处是没有循环依赖,也比较推荐这个方法。如果想知道什么是循环依赖,请看文章里的面试题之Spring如何解决循环依赖注入问题。