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");
}
}