Spring AOP通知执行规则与冲突切点选择问题咨询
Spring AOP问题解答
1. Spring AOP如何定义要执行的通知?
Spring AOP通过注解划分不同类型的通知,核心执行逻辑明确:
- 基础通知(
@Before、@After、@AfterReturning、@AfterThrowing):无需手动触发目标方法,Spring会自动在对应时机执行通知逻辑,之后/之前自动流转到目标方法或其他匹配的通知。 - 环绕通知(
@Around):必须手动调用proceed()方法才能触发目标方法执行——如果不调用proceed(),整个调用链路会直接中断,目标方法和后续匹配的所有通知都不会执行。
结合你的场景:第一个切点如果是环绕通知且未调用proceed(),会直接阻断后续所有逻辑,哪怕第二个切点调用proceed()也无法触发目标方法。
2. 存在两个冲突切点时,如何选择执行哪个?
处理多切点匹配同一目标方法的优先级问题,需从两方面入手:
(1)切点表达式的匹配精度
Spring AOP会优先选择更具体的切点表达式:
- 例如
execution(* com.luxoft.springaop.example1.User.create(..))(精确到具体方法)比within(com.luxoft.springaop.example1.*)(匹配包下所有类)优先级更高,会先匹配执行。
(2)切面的执行顺序(@Order注解)
@Order必须加在切面类上(方法级@Order对Spring AOP无效),数值越小优先级越高。- 如果多个切面的切点都匹配目标方法,高优先级切面的环绕通知会先执行前置逻辑,调用
proceed()后进入低优先级切面,低优先级切面调用proceed()才会触发目标方法,之后按反向顺序执行各切面的后置逻辑。
针对你的@Order无效问题的排查点
- 若两个通知在同一个切面类中,
@Order注解完全不起作用,Spring会按照通知方法名的字母顺序执行。需将通知拆分到不同切面类,再在类上添加@Order。 - 若修改后仍只执行一个切点,需检查第二个切点的表达式是否真的匹配目标方法,或第一个切面的环绕通知是否确实调用了
proceed()(如果第一个切面没调用,链路会直接中断)。
内容的提问来源于stack exchange,提问作者LowCool
相关产品推荐
相关产品推荐

