如何解决SpringAop内部调用时不经过代理类的问题
如何解决SpringAop内部调用时不经过代理类的问题,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
SpringAop
AOP代理织入时期
编译时织入 - aspectj框架
类加载时织入 - aspectj框架
运行时织入 - spring-aop
动态代理方式
JDK - 被代理对象必须需要实现接口
CGLIB - 采用继承被代理对象方式实现代理功能
解决SpringAop内部调用时不经过代理类(而是通过this)
方案一
通过编译时织入或者类加载时织入代码
方案二
通过当前代理类调用目标方法
getOne()方法中直接调用getAll()时是通过this对象,这时候getAll()方法上的@AopLog就不会被AOP扫描到
@Service@Slf4jpublic 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@Slf4jpublic 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方法不会被代理
关于如何解决SpringAop内部调用时不经过代理类的问题问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341