在springboot中,只要正确定义了切面,在外部service调用相关方法时就会进代理类的方法。
但是如果是当前service中的多个方法互相调用就只有最外层的方法走切面方法,
例如,LogService 有两个方法A()和B(),A调用了B,则外部service调用A时不会走B相关的切面方法。
原因网上已经说得已经很多了,和aop原理相关,大体就是外部直接调用logService.B()时这个logService对象是个代理对象,相关方法也是aop包装过的。而logService.A()中调用的B(),是原装的B()。
解决的办法也很简单,思路就是调用logService的代理对象的B()方法
1.
在A()调用B()时,使用类似 applicationContext.getBean() 的方法获取当前service的代理对象
applicationContext.getBean(LogService.class).B()
2.
直接用@Autowired在当前service里声明一个自己类型的属性
@Autowired private LogService logService;
这个对象就是代理对象
3.
使用 AopContext.currentProxy() 获取当前service的代理对象
需要配合@EnableAspectJAutoProxy(exposeProxy = true)注解使用
虽然知道aop的原理,但是第一次遇到的时候还是没有反应过来。。。