spring-boot aop 不生效, 两个方法A()和B(),A调用了B,则外部service调用A时不会走B相关的切面方法

在springboot中,只要正确定义了切面,在外部service调用相关方法时就会进代理类的方法。

但是如果是当前service中的多个方法互相调用就只有最外层的方法走切面方法,

例如,LogService 有两个方法A()和B(),A调用了B,则外部service调用A时不会走B相关的切面方法。

原因网上已经说得已经很多了,和aop原理相关,大体就是外部直接调用logService.B()时这个logService对象是个代理对象,相关方法也是aop包装过的。而logService.A()中调用的B(),是原装的B()。

解决的办法也很简单,思路就是调用logService的代理对象的B()方法

在A()调用B()时,使用类似 applicationContext.getBean() 的方法获取当前service的代理对象

applicationContext.getBean(LogService.class).B()

直接用@Autowired在当前service里声明一个自己类型的属性

@Autowired private LogService logService;

这个对象就是代理对象

使用 AopContext.currentProxy() 获取当前service的代理对象

需要配合@EnableAspectJAutoProxy(exposeProxy = true)注解使用


版权声明:本文为eases_stone原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。