Из справочных документов, касающихся Заказ заказа
Когда два совета, определенных в разных аспектах, должны работать в одной точке соединения, если не указано иное, порядок исполнения не определен. Вы можете контролировать порядок выполнения, указав приоритет.
Для меня поведение воспроизводимо, когда я заказываю Аспекты следующим образом. Я приказал, чтобы Around
совет выполнялся до Before
совета. Также обратите внимание, что я прокомментировал вызов joinPoint.proceed();
.
@Component
@Aspect
@Order(0)
public class TryCatchLogAspect {
@Pointcut("execution(sec2.aop.bean.AssertionData sec2.aop.bean..*(..))")
private void pageActionsTryCatchLog() {
}
@Around("pageActionsTryCatchLog()")
public Object tryCatchLog(ProceedingJoinPoint joinPoint) throws Throwable {
// Object result = joinPoint.proceed();
System.out.println("pageActionsTryCatchLog");
return new AssertionData();
}
}
и
@Component
@Aspect
@Order(1)
public class CheckRedBannerAspect {
@Before("@annotation(CheckRedBanner)")
public void myAdviceForMethodAnnotation(JoinPoint joinPoint) {
handleBeforeExecution(joinPoint);
}
protected void handleBeforeExecution(JoinPoint joinPoint) {
System.out.println("Made iitttt !!! ");
}
}
, когда я раскомментировал вызов proceed()
, оба аспекта работают.
@Around("pageActionsTryCatchLog()")
public Object tryCatchLog(ProceedingJoinPoint joinPoint) throws Throwable {
Object result = joinPoint.proceed();
System.out.println("pageActionsTryCatchLog");
return new AssertionData();
}
Когда мы явно не называем joinPoint.proceed();
, весна делает это за нас. Но в первом случае мы возвращаемся без вызова базового метода, и @Before
рекомендация не выполняется.