Порядок работает на аспект и работает как надо. Однако последующие советы выполняются в обратном порядке.
Представьте, что ваши аспекты имеют как @Before
, так и @After
@Component
@Aspect
@Order(1)
public class AspectOne {
@Before(pointcut = "exection(* com.test.*..*(..))")
public void soSomethingBefore(Joinpoint jp) {
System.out.println("[BEFORE] AspectOne");
}
@AfterThrowing(pointcut = "exection(* com.test.*..*(..))", throwing = "ex")
public void doSomething(JoinPoint jp, Exception ex){
System.out.println("[AFTER ] AspectOne");
}
и
@Component
@Aspect
@Order(2)
public class AspectTwo {
@Before(pointcut = "exection(* com.test.*..*(..))")
public void soSomethingBefore(Joinpoint jp) {
System.out.println("[BEFORE] AspectTwo");
}
@AfterThrowing(pointcut = "exection(* com.test.*..*(..))", throwing = "ex")
public void doSomething(JoinPoint jp, Exception ex){
System.out.println("[AFTER ] AspectTwo");
}
Если вы посмотрите на результат, он будет
[BEFORE] AspectOne
[BEFORE] AspectTwo
[AFTER ] AspectTwo
[AFTER ] AspeectOne
Таким образом, оформление заказа выполнено, однако вы должны принять во внимание, что после того, как советы будут в обратном порядке.
Вы можете спросить, почему?
Давайте посмотрим @Around
совет, который в основном является @Before
и @After
советом. Если первый аспект касается запуска транзакции, это должен быть последний для фиксации / отката транзакции, поскольку все промежуточное должно участвовать в одной транзакции. Если бы он был первым, кто запустил и зафиксировал другие части выполнения, он не был бы частью tx, что может привести к странным проблемам.
ПРИМЕЧАНИЕ: Удалите @Configuration
и @EnableAspectJAutoProxy
, просто создайте 1 класс конфигурации, который делает это, и сделайте ваши аспекты регулярными @Component
классами.