欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

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

时间:2022-12-08 12:56:01|栏目:JAVA代码|点击:

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方法不会被代理

上一篇:IntelliJ IDEA全局内容搜索和替换教程图解

栏    目:JAVA代码

下一篇:Spring 单元测试中如何进行 mock的实现

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

本文地址:http://www.codeinn.net/misctech/220900.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有