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中catalina.home与catalina.base区别点整理

    java中catalina.home与catalina.base区别点整理

    在本篇文章里小编给大家整理的是关于java项目中catalina.home与catalina.base区别点,需要的朋友们可以学习下。
    2020-02-02
  • JNI实现最简单的JAVA调用C/C++代码

    JNI实现最简单的JAVA调用C/C++代码

    这篇文章主要介绍了JNI实现最简单的JAVA调用C/C++代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • json-lib将json格式的字符串,转化为java对象的实例

    json-lib将json格式的字符串,转化为java对象的实例

    下面小编就为大家带来一篇json-lib将json格式的字符串,转化为java对象的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • java后台处理前端传的json串方法

    java后台处理前端传的json串方法

    今天小编就为大家分享一篇java后台处理前端传的json串方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • SpringCache之 @CachePut的使用

    SpringCache之 @CachePut的使用

    这篇文章主要介绍了SpringCache之 @CachePut的使用,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • springboot中不能获取post请求参数的解决方法

    springboot中不能获取post请求参数的解决方法

    这篇文章主要介绍了springboot中不能获取post请求参数的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Javascript和Java语言有什么关系?两种语言间的异同比较

    Javascript和Java语言有什么关系?两种语言间的异同比较

    虽然Javascript与Java有紧密的联系,但却是两个公司开发的不同的两个产品。那么js和java有什么关系,两种语言的不同点是什么呢?介于这两个问题,小编一起给大家解答下
    2016-09-09
  • Java groovy内存回收测试步骤解析

    Java groovy内存回收测试步骤解析

    这篇文章主要介绍了Java groovy内存回收测试步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • SpringBoot如何解析应用参数args

    SpringBoot如何解析应用参数args

    文章主要介绍了SpringBoot启动过程中如何解析`main`函数中的参数`args`,包括如何解析命令行参数、访问选项参数和非选项参数,接着,介绍了`ApplicationArguments`接口及其方法,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • MyBatis自定义resultMap三种映射关系示例详解

    MyBatis自定义resultMap三种映射关系示例详解

    这篇文章主要介绍了MyBatis自定义resultMap三种映射关系,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08

最新评论