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

 更新时间:2022年01月03日 10:52:08   作者:luckyman98  
这篇文章主要介绍了解决SpringAop内部调用时不经过代理类的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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

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

相关文章

  • springboot创建文件夹失败的解决

    springboot创建文件夹失败的解决

    这篇文章主要介绍了springboot创建文件夹失败的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • MyBatis的注解使用、ORM层优化方式(懒加载和缓存)

    MyBatis的注解使用、ORM层优化方式(懒加载和缓存)

    这篇文章主要介绍了MyBatis的注解使用、ORM层优化方式(懒加载和缓存),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 详解Spring AOP

    详解Spring AOP

    本文非常详细讲解了Spring AOP,本篇文章通过大量的代码,讲解了Spring AOP的使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • spring boot线上日志级别动态调整的配置步骤

    spring boot线上日志级别动态调整的配置步骤

    这篇文章主要为大家介绍了spring boot线上日志级别动态调整的配置步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • ShardingSphere数据分片算法及测试实战

    ShardingSphere数据分片算法及测试实战

    这篇文章主要为大家介绍了ShardingSphere数据分片算法及测试实战示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Java对List进行排序的两种实现方法

    Java对List进行排序的两种实现方法

    这篇文章主要给大家介绍了关于Java对List进行排序的两种实现方法,第一种是实体类自己实现比较,第二种是借助比较器进行排序,下面开一起看看详细的介绍吧,有需要的朋友们可以参考借鉴。
    2016-12-12
  • Java设计模式之中介者模式的实现方式

    Java设计模式之中介者模式的实现方式

    Java中介者模式是一种行为型设计模式,它通过一个中介者对象来协调多个对象之间的交互,降低对象之间的耦合度,提高系统的可维护性和可扩展性。本文将介绍该设计模式的原理、使用场景和实现方法
    2023-04-04
  • SpringBoot + 微信公众号JSAPI支付功能的实现

    SpringBoot + 微信公众号JSAPI支付功能的实现

    这篇文章主要介绍了SpringBoot + 微信公众号JSAPI支付功能的实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 使用Java生成JWT(JSON Web Token)的方法示例

    使用Java生成JWT(JSON Web Token)的方法示例

    在现代应用程序中,身份验证和授权是至关重要的,JWT是一种简单而强大的身份验证和授权机制,可以在Web应用程序中安全地传输用户信息,本文主要介绍了使用Java生成JWT的方法示例,感兴趣的可以了解一下
    2024-03-03
  • Java Kafka实现延迟队列的示例代码

    Java Kafka实现延迟队列的示例代码

    kafka作为一个使用广泛的消息队列,很多人都不会陌生。本文将利用Kafka实现延迟队列,文中的示例代码讲解详细,感兴趣的小伙伴可以尝试一下
    2022-08-08

最新评论