本文主要是介绍事务不起效或切面不执行的 两种Spring AOP切面增强的方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题描述
在一个类A中,有两个方法,一个方法methodA,一个方法methodB,在methodA方法中调用methodB方法,两个方法上都使用了自定义的注解@CustomAnnotation,同时编写了切面来拦截使用了该注解的方法,伪代码如下:
class A {@CustomAnnotationpublic void methodA() {methodB();}@CustomAnnotationpublic 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();
同理,事务增强也可以通过以上方案解决
这篇关于事务不起效或切面不执行的 两种Spring AOP切面增强的方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!