Spring AOP注解失效问题

需求需要自定义注解,但是在实际应用中发现注解并没有生效,查询之后发现原因如下:

同一个类X中有方法A和方法B,其中方法B上加了注解,方法A又调用了方法B,此时注解无效。

如果是另一个类Y中的方法调用类X中的方法B,此时注解生效。因为在类Y中是通过类X的对象调用方法B的,因为此时Spring会判断方法B上有注解,所以会动态生成类X的代理对象,并使用这个代理对象来调用方法B。
但是在同一个类中的方法A调用方法B,并且想在别的类中使用类X的对象来调用方法A时,Spring检测方法A上没有注解,所以还是使用原对象而不是代理对象来调用方法A。接下来在方法A中调用方法B时,原对象中的方法B的注解无效。

综上所述,我们很容易发现解决这个问题的方法。一是使方法A和方法B没有依赖,直接使用类X的对象调用方法B。但是有时候根据业务逻辑来说,这样分开并不合适。另一种方法:手动拿到代理对象,并使用这个代理对象来调用方法B。

// 在A方法内部调用B方法
// 1.直接调用B,注解失效。
B()
// 2.拿到代理类对象,再调用B。
((X)AopContext.currentProxy()).B()

手动获取代理对象时,需要在配置中将expose-proxy设置为true,则直接获取就可以了:

<aop:config expose-proxy="true"><!—xml风格支持-->  

相关链接:https://www.oudahe.com/p/51061/
https://blog.csdn.net/sunhuaqiang1/article/details/82594886

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值