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

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

场景

存在一个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来进行编译。第三种对代码有侵入性。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本章内容: 面向切面编程的基本原理 通过POJO创建切面 使用@AspectJ注解 为AspectJ切面注入依赖 ...
    谢随安阅读 3,193评论 0 9
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,362评论 11 349
  • 可是他条件很好啊,对我也很好啊。 ——大龄未婚女青年如是说 1 “我要上楼了,先不说了,你要乖哦。”电话传来男人...
    小西瓜思密达阅读 373评论 0 0
  • A.今天学了什么 1.css背景 2 .css文本 3.css字体 4.css链接 5.列表样式 6 边框 7 表...
    shinjia阅读 144评论 0 0
  • 幸福到飞升 心心念念的周六ʕ •ᴥ•ʔ 去找小特纳 我花真是有种难以言表的魅力 两年前初入我小花坑 现在心甘情愿再...
    小黄穿马甲阅读 130评论 0 0