问题描述
在一个类A中,有两个方法,一个方法methodA,一个方法methodB,在methodA方法中调用methodB方法,两个方法上都使用了自定义的注解@CustomAnnotation,同时编写了切面来拦截使用了该注解的方法,伪代码如下:
class A {
@CustomAnnotation
public void methodA() {
methodB();
}
@CustomAnnotation
public void methodB() {
}
}
切面伪代码如下:
@Slf4j
@Component
@Aspect
public class DistributedLockAspect {
@Around(value = "@annotation(customAnnotation)", argNames = "pjp, customAnnotation")
public Object around(ProceedingJoinPoint pjp, CustomAnnotation customAnnotation) throws Throwable {
log.info("拦截");
return pjp.proceed();
}
}
问题:调用A类中的methodA方法,发现最终只会打印一次拦截
解决方案
方案1:使用AOP上下文获取代理对象进行调用
(1)@EnableAspectJAutoProxy(exposeProxy = true),暴露代理对象
(2)调用methodB方法使用如下方式:
if (AopContext.currentProxy() != null) {
partnerSetting = ((A) AopContext.currentProxy()).methodB();
}
方案2:注入自身类对象进行调用
(1)注入自身类对象
@Autowired
private A current;
(2)使用注入的类对象进行调用methodB
current.methodB();
同理,事务增强也可以通过以上方案解决