解决SpringAop内部调用时不经过代理类的问题 目录 SpringAop AOP代理织入时期 动态代理方式 解决SpringAop内部调用时不经过代理类(而是通过this) 方案一 方案二 this使得SpringAop失效之谜 问题描述 问题剖析 SpringAop AOP代理织入时期 编译时织入 - aspectj框架
目录
- SpringAop
- AOP代理织入时期
- 动态代理方式
- 解决SpringAop内部调用时不经过代理类(而是通过this)
- 方案一
- 方案二
- this使得SpringAop失效之谜
- 问题描述
- 问题剖析
SpringAop
AOP代理织入时期
- 编译时织入 - aspectj框架
- 类加载时织入 - aspectj框架
- 运行时织入 - spring-aop
动态代理方式
- JDK - 被代理对象必须需要实现接口
- CGLIB - 采用继承被代理对象方式实现代理功能
解决SpringAop内部调用时不经过代理类(而是通过this)
方案一
通过编译时织入或者类加载时织入代码
方案二
通过当前代理类调用目标方法
getOne()方法中直接调用getAll()时是通过this对象,这时候getAll()方法上的@AopLog就不会被AOP扫描到
@Service
@Slf4j
public 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
@Slf4j
public 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内部调用时不经过代理类的问题
- 基于Java Agent的premain方式实现方法耗时监控问题 2023-06-17
- Java实现顺序表的操作详解 2023-05-19
- ExecutorService Callable Future多线程返回结果原理解析 2023-06-01
- SpringBoot使用thymeleaf实现一个前端表格方法详解 2023-06-06
- Springboot整合minio实现文件服务的教程详解 2022-12-03
- JSP 制作验证码的实例详解 2023-07-30
- Java中的日期时间处理及格式化处理 2023-04-18
- 深入了解Spring的事务传播机制 2023-06-02
- Spring Security权限想要细化到按钮实现示例 2023-03-07
- JSP页面间传值问题实例简析 2023-08-03