美文网首页
spring切面在对象内部方法调用不生效

spring切面在对象内部方法调用不生效

作者: HelloArmin | 来源:发表于2016-10-24 15:33 被阅读502次

在实际编写切面方法和应用切面的时候,发现在对象内的方法之间调用,是不会进入定义在方法上的切面的。

场景

存在一个bean对象,对bean对象的两个方法methodA和methodB都应用了切面。在methodA方法里会调用methodB方法。

现在从外部调用bean.methodA(),其实你希望得到的效果是:

proxy            bean
methodAP()  ---> methodA
                   |
   /---------------/
   |
   V
methodBP()  ---> methodB

而实际得到的效果是

proxy            bean
methodAP()  ---> methodA
                   |
                   V
methodBP()  ---> methodB

原因分析

在methodA内部调用methodB时,方法是直接进行调用,并不会调用到代理对象的代理方法上。

解决方案

  • 重构代码

  • methodA不调用methodB

  • methodA和methodB放置在两个不同的类中

  • 将methodB的切面方法代理逻辑合并到methodB的代理逻辑中

  • 使用AspectJ进行编译织入

  • 显式调用代理对象的方法

    public void methodA(){
      ((BeanClassName)AopContext.currentProxy()).methodB();
     }
    
    

目前,推荐的也只有第一种方法。对代码进行重构,methodB可能就不应该允许从外面进行调用。而第二种会影响所有的切面,而且需要借助aspectJ来进行编译。第三种对代码有侵入性。

相关文章

网友评论

      本文标题:spring切面在对象内部方法调用不生效

      本文链接:https://www.haomeiwen.com/subject/sesluttx.html