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

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

相关文章

  • Java中YYYY-MM-dd与yyyy-MM-dd的区别及跨年问题

    Java中YYYY-MM-dd与yyyy-MM-dd的区别及跨年问题

    YYYY-MM-dd可能会导致跨年周的日期被归属到错误的年份, yyyy-MM-dd总是表示实际的日历年份,无论日期所在的周是否跨年,本文就来介绍一下两者的区别,感兴趣的可以了解一下
    2024-01-01
  • 使用java数组 封装自己的数组操作示例

    使用java数组 封装自己的数组操作示例

    这篇文章主要介绍了使用java数组 封装自己的数组操作,结合实例形式分析了java数组索引、遍历等相关封装操作技巧与注意事项,需要的朋友可以参考下
    2020-03-03
  • 将idea中xml文件背景颜色去除的图文教程

    将idea中xml文件背景颜色去除的图文教程

    这篇文章主要介绍了将idea中xml文件背景颜色去除,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Java实现将数组的元素用逗号连接的多种方法

    Java实现将数组的元素用逗号连接的多种方法

    在 Java 开发中,我们经常需要将数组中的元素用逗号连接成一个字符串,这种需求在日志记录、数据导出、API 响应等场景中非常常见,本文将详细介绍如何在 Java 中实现这一功能,并提供多种简洁的方法和优化建议,需要的朋友可以参考下
    2025-01-01
  • springboot整合持久层的方法实现

    springboot整合持久层的方法实现

    本文主要介绍了springboot整合持久层的方法实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Java main 方法面试题的详细整理

    Java main 方法面试题的详细整理

    这篇文章主要介绍了Java main 方法面试题的详细整理的相关资料,这里介绍了10个经典面试题的方法,需要的朋友可以参考下
    2017-09-09
  • 聊聊spring继承的问题

    聊聊spring继承的问题

    这篇文章主要介绍了spring继承的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java运行时数据区概述详解

    Java运行时数据区概述详解

    这篇文章主要介绍了Java运行时数据区概述,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • common-upload上传文件功能封装类分享

    common-upload上传文件功能封装类分享

    本文介绍一个common-upload上传封装类,为了更方便的上传文件,对common-upload进行了一个简单的封装,大家参考使用吧
    2014-01-01
  • Netty启动流程注册多路复用源码解析

    Netty启动流程注册多路复用源码解析

    这篇文章主要介绍了Netty启动流程注册多路复用源码分析,继续分析channel是如何注册到selector中的,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-03-03

最新评论