栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

@Transactional注解失效:Spring AOP为什么调用本类切面方法没有生效

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

@Transactional注解失效:Spring AOP为什么调用本类切面方法没有生效

@Transactional注解失效:Spring AOP为什么调用本类切面方法没有生效

AOP 的实现原理是,通过动态代理生成一个新的代理类(因为是运行时生成,所以称为动态),再通过代理类来调用目标方法,并在调用前或调用后添加操作。

JDK 动态代理需要通过接口类;CGlib动态代理不需要目标实现接口;

动态代理的实现类似于:

@Service
public class A {
    @Transactional
    public void a(){
        b();
        c();
    }
    public void b(){}
    public void c(){}
}
public class Proxy$xxxx {
    @Autowired
    private A a;
    
    public void a(){
        // @Around
        // @Before
        a.a();
        // @Around
        // @After(final增强)
        // @AfterReturning 方法正常退出时执行
        // @AfterThrowing 异常抛出增强,执行但不catch
    }
}


由此可以看出实际调用是通过this来调用, 所以调用本类切面方法, 被调用的方法的切面并不会生效.

如何生效

不用this引用, 而使用代理类来执行目标方法就行了:

@Service
public class A{

  //拿到代理类
  @Autowired
  private A self;

  public void a(){
    //通过代理类来调用方法
    self.b();
    self.c();
  }
}

另外, Spring官方提倡的是使用一个新的中间类来解决此类问题:

@Service
public class Mid {
  @Autowired
  private A a;

  public void a(){
    //通过代理类来调用方法
    a.b();
    a.c();
  }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/749655.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号