解决SpringAop内部调用时不经过代理类的问题

目录SpringAopAOP代理织入时期动态代理方式解决SpringAop内部调用时不经过代理类(而是通过this)方案一方案二this使得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内部调用时不经过代理类的问题

相关文章:

你感兴趣的文章:

标签云: