spring AOP代理执行@EnableAspectJAutoProxy的exposeProxy属性详解

 更新时间:2023年09月11日 17:18:38   作者:天还下着毛毛雨  
这篇文章主要为大家介绍了spring AOP代理执行@EnableAspectJAutoProxy的exposeProxy属性详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

前面讲到,以JDK动态代理方式 的代理对象已经创建成功,spring中 使用JDK动态代理时,传入的InvokeHandler是JdkDynamicAopProxy类型。

并且数据结构是这样的

并且他的AdvisedSupport advised 属性是 proxyFactory{

       proxyFactory{
            advisors :符合该类的所有的切面,
            targetSource:被代理目标对象
            proxyTargetClass :代理的方式
}

那么实现InvokeHandler接口,那么代理对象调用方法时,就会调入Invoke方法 来进行具体的增强。spring aop的具体代理逻辑就在这个方法中。

equals和hashCode方法不进行代理

首先进来会取出代理的目标对象,this.advised.targetSource

然后进行equals()和hashCode()的判断,这两个方法 是不会代理的,直接调用原生方法

@EnableAspectJAutoProxy配置exposeProxy=true,暴露代理对象

然后如果@EnableAspectJAutoProxy配置的exposeProxy为true的话,

@EnableAspectJAutoProxy(proxyTargetClass = false,exposeProxy = true)

会将代理对象提前放入 ThreadLocal里面,供代理过程中其他地方获取

应用场景

这个挺有用的。比如 某个类的 proxyMethodA() 和 proxyMethodB()都会命中切面,被代理。如果以下面proxyMethodA方法内部直接 调用proxyMethodB()方法,

其实 调用的原生对象的proxyMethodB()方法,是不会走 proxyMethodB()的代理逻辑的。

@Component
public class ProxyClass implements InterFace {
    public void proxyMethodA() {
        proxyMethodB();
    }

    public void proxyMethodB() {
    }
}

所以,我们要去获取ProxyClass的代理对象来在proxyMethodA()的方法内部 调用proxyMethodB()

注入自己的代理对象

一种是自己注入自己,那么肯定注入进来的是代理对象,那么用代理对象去调用它的 proxyMethodB()方法,肯定是会走代理的。

@Component
public class ProxyClass implements MyBeanService {
    @Autowired
    ProxyClass proxyClass;
    public void proxyMethodA() {
        // 注入进来的是 proxyClass代理对象
        proxyClass.proxyMethodB();
    }
    public void proxyMethodB() {
    }
}

AopContext.currentProxy()

还有一种就是 上面源码里的AopContext.currentProxy()

会把代理对象放入ThreadLocal中,

直接在 proxyMethodA() 方法内部AopContext.currentProxy()获取到代理对象,然后调用它的proxyMethodB()

public class ProxyClass implements MyBeanService {
    public void proxyMethodA() {
        Object o = AopContext.currentProxy();
        ((ProxyClass)o).proxyMethodB();
    }
    public void proxyMethodB() {
    }
}

以上就是spring AOP代理执行@EnableAspectJAutoProxy的exposeProxy属性详解的详细内容,更多关于spring AOP执行exposeProxy属性的资料请关注脚本之家其它相关文章!

相关文章

  • 详解Java SSM项目部署上线配置方法(阿里云服务器ECS + 云数据库RDS MySQL)(宝塔)

    详解Java SSM项目部署上线配置方法(阿里云服务器ECS + 云数据库RDS MySQL)(宝塔)

    这篇文章主要介绍了Java SSM项目部署上线(阿里云服务器ECS + 云数据库RDS MySQL)(宝塔)的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2024-01-01
  • 如何在Java SpringBoot项目中配置动态数据源你知道吗

    如何在Java SpringBoot项目中配置动态数据源你知道吗

    这篇文章主要介绍了SpringBoot如何在运行时动态添加数据源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-09-09
  • springboot如何根据配置屏蔽接口返回字段

    springboot如何根据配置屏蔽接口返回字段

    这篇文章主要介绍了springboot如何根据配置屏蔽接口返回字段问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • SpringBoot使用MyBatis实现数据的CRUD

    SpringBoot使用MyBatis实现数据的CRUD

    MyBatis是一个轻量级的对象关系映射(Object-Relational Mapping,ORM)框架,它允许开发者通过编写SQL动态查询数据库,而无需显式地操作JDBC,对于增删改查操作,MyBatis提供了一种基于XML或注解的方式来进行,本文介绍了SpringBoot使用MyBatis实现数据的CRUD
    2024-11-11
  • GateWay中StripPrefix的作用及说明

    GateWay中StripPrefix的作用及说明

    StripPrefix过滤器剥离路径前缀,PrefixPath则添加前缀,例如,访问http://host:port/lbs/hello时,StripPrefix=1会将请求转至http://bds-lbs-service/hello,PrefixPath会添加/lbs前缀,两者作用相反,用于路由路径调整
    2025-07-07
  • Java之SM4加密解密的实现

    Java之SM4加密解密的实现

    这篇文章主要介绍了Java之SM4加密解密的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Java SpringMVC的@RequestMapping注解使用及说明

    Java SpringMVC的@RequestMapping注解使用及说明

    这篇文章主要介绍了Java SpringMVC的@RequestMapping注解使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Idea连接GitLab的过程以及创建在gitlab中创建用户和群组方式

    Idea连接GitLab的过程以及创建在gitlab中创建用户和群组方式

    本文介绍了如何在IDEA中连接GitLab,首先需安装GitLab插件并配置SSH免密登录,接着,创建GitLab个人令牌并在Git中配置,文章还提到了如何在GitLab中创建用户、群组及设置权限,如Owner、Maintainer、Developer等,并强调了群组名和人员名称的命名规范
    2024-11-11
  • idea在用Mybatis时xml文件sql不提示解决办法(提示后背景颜色去除)

    idea在用Mybatis时xml文件sql不提示解决办法(提示后背景颜色去除)

    mybatis的xml文件配置的时候,有时候会没有提示,这让我们很头疼,下面这篇文章主要给大家介绍了关于idea在用Mybatis时xml文件sql不提示的解决办法,提示后背景颜色去除的相关资料,需要的朋友可以参考下
    2023-03-03
  • Java实现归并排序的示例代码

    Java实现归并排序的示例代码

    归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。本文将用Java实现这一排序,需要的可以参考一下
    2022-08-08

最新评论