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)(宝塔)的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧2024-01-01
如何在Java SpringBoot项目中配置动态数据源你知道吗
这篇文章主要介绍了SpringBoot如何在运行时动态添加数据源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2021-09-09
Java SpringMVC的@RequestMapping注解使用及说明
这篇文章主要介绍了Java SpringMVC的@RequestMapping注解使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-01-01
Idea连接GitLab的过程以及创建在gitlab中创建用户和群组方式
本文介绍了如何在IDEA中连接GitLab,首先需安装GitLab插件并配置SSH免密登录,接着,创建GitLab个人令牌并在Git中配置,文章还提到了如何在GitLab中创建用户、群组及设置权限,如Owner、Maintainer、Developer等,并强调了群组名和人员名称的命名规范2024-11-11
idea在用Mybatis时xml文件sql不提示解决办法(提示后背景颜色去除)
mybatis的xml文件配置的时候,有时候会没有提示,这让我们很头疼,下面这篇文章主要给大家介绍了关于idea在用Mybatis时xml文件sql不提示的解决办法,提示后背景颜色去除的相关资料,需要的朋友可以参考下2023-03-03


最新评论