заказ рекомендаций по весенней аннотации - PullRequest
7 голосов
/ 11 января 2012

У меня есть метод с двумя аннотациями

@One
@Two
public Object foo() { ... }

У меня есть два аспекта, которые используют эти аннотации

@Around("@annotation(One)")
public Object doOne(final ProceedingJoinPoint joinPoint) throws Throwable { ... }

и

@Around("@annotation(Two)")
public Object doTwo(final ProceedingJoinPoint joinPoint) throws Throwable { ... }

Но это порядокв котором эти советы исполняются неопределенно?

Ответы [ 4 ]

7 голосов
/ 11 января 2012

Порядок не определен. Если вам нужен определенный порядок, используйте аннотацию @Order.

Смотри также:

4 голосов
/ 11 января 2012

6.2.4.7. Консультация заказа

Что происходит, когда несколько советов хотят работать на та же точка соединения? Spring AOP следует тем же правилам приоритета, что и AspectJ для определения порядка исполнения совета. Самый высокий Приоритетный совет запускается сначала «по пути» (поэтому, учитывая две части перед советом запускается тот, который имеет наивысший приоритет). "На выход из точки соединения, совет с наивысшим приоритетом выполняется последним (так, учитывая два куска после совета, тот с самым высоким приоритет будет выполняться вторым).

Когда два совета, определенные в разных аспектах, должны работать в той же точке соединения, если не указано иное, порядок исполнение не определено. Вы можете контролировать порядок исполнения по указав приоритет Это делается обычным способом Spring реализовать интерфейс org.springframework.core.Ordered в Класс аспекта или аннотирование его с помощью аннотации Order. Учитывая два аспекты, аспект, возвращающий нижнее значение из Ordered.getValue () (или значение аннотации) имеет более высокий приоритет.

Когда два совета, определенных в одном и том же аспекте, должны быть выполнены в той же точке соединения, порядок не определен (так как нет способ получения заказа декларации через отражение для скомпилированные javac классы). Рассмотрите возможность объединения таких методов советов в один метод рекомендации для каждой точки соединения в каждом классе аспектов или рефакторинг советы по отдельным аспектным классам - которые можно заказать на уровне аспекта.

http://static.springsource.org/spring/docs/2.0.x/reference/aop.html

1 голос
/ 11 января 2012

Порядок не определен, если не указано явно (например, с помощью @Order)

0 голосов
/ 28 ноября 2012
  1. На пути к точке соединения сначала выполняется совет с наименьшей стоимостью ордера.

  2. На выходе из точки соединения совет ссначала выполняется самое высокое значение ордера.

  3. Когда два советника, определенных в одном и том же аспекте, должны выполняться в одной и той же точке соединения, порядок не определен. Рассмотрите возможность объединения таких методов совета в один метод советаза точку соединения в каждом классе аспектов или реорганизовать советы в отдельные классы аспектов, которые можно упорядочить на уровне аспектов.
...