解决SpringAop内部调用时不经过代理类的问题

2022-01-24 0 692
目录

SpringAop

AOP代理织入时期

  • 编译时织入 - aspectj框架
  • 类加载时织入 - aspectj框架
  • 运行时织入 - spring-aop

动态代理方式

  • JDK - 被代理对象必须需要实现接口
  • CGLIB - 采用继承被代理对象方式实现代理功能

解决SpringAop内部调用时不经过代理类(而是通过this)

方案一

通过编译时织入或者类加载时织入代码

方案二

通过当前代理类调用目标方法

getOne()方法中直接调用getAll()时是通过this对象,这时候getAll()方法上的@AopLog就不会被AOP扫描到

@Service
@Slf4j
public class ServiceImpl implements IService {
    @Override
    @AopLog(\"value=getOne\")
    public void getOne() {
        log.info(\"getOne running\");
        // 直接调用getAll()方法 = this.getAll()
        getAll();
    }
    @Override
    @AopLog(\"value=getAll\")
    public void getAll() {
        log.info(\"getAll running\");
    }
}

修改getOne()方法,通过AopContext.currentProxy()方法获取当前代理类,通过代理类来调用getAll()方法,这时候就是通过代理类调用的

@Service
@Slf4j
public class ServiceImpl implements IService {
    @Override
    @AopLog(\"value=getOne\")
    public void getOne() {
        log.info(\"getOne running\");
        // 获取当前代理类,通过代理类来调用getAll()方法
        ((IService) AopContext.currentProxy()).getAll();
    }
    @Override
    @AopLog(\"value=getAll\")
    public void getAll() {
        log.info(\"getAll running\");
    }
    @AopLog(\"value=getById\")
    private void getById() {
        log.info(\"getById running\");
    }
}

this使得SpringAop失效之谜

问题描述

类Demo被AOP扫描到,其中有A和B两个方法,A方法中调用了B方法,执行A方法时,B方法的代理没有生效

问题剖析

我们知道AOP底层使用JDK动态代理和cglib动态代理想结合,通过判断去创建对应的代理对象。

而不管是那种方法,最终执行完代理后,都会执行目标方法:method.invoke(target,agrs)-->传入目标对象

所以执行A方法的代理后,执行A的目标方法,此时执行的对象是目标对象,所以目标对象执行A方法是A中隐藏的this

指的就是目标对象,即执行B方法的不再是代理对象而是目标对象,故B方法不会被代理

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!

猪小侠源码-最新源码下载平台 Java教程 解决SpringAop内部调用时不经过代理类的问题 http://www.20zxx.cn/297372/xuexijiaocheng/javajc.html

猪小侠源码,优质资源分享网

常见问题
  • 本站所有资源版权均属于原作者所有,均只能用于参考学习,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,建议提前注册好百度网盘账号,使用百度网盘客户端下载
查看详情

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务