SpringBoot中Aop失效解决办法

本文介绍了Spring Boot中AOP的方法调用问题。外部service调用相关方法时会进代理类方法,但当前service内方法互相调用,只有最外层走切面方法。原因与AOP原理有关,还给出三种解决办法,如用applicationContext.getBean()获取代理对象等。

在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的原理,但是第一次遇到的时候还是没有反应过来。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值