С официального Javadoc о @Order:
Аннотация, который определяет порядок. Значение является необязательным и представляет собой значение заказа, определенное в интерфейсе Ordered. Более низкие значения имеют более высокий приоритет. Значением по умолчанию является Ordered.LOWEST_PRECEDENCE, что указывает на самый низкий приоритет (проигрывание любого другого указанного значения заказа).
Это означает, что Aspect2
также будет иметь значение Ordered.LOWEST_PRECEDENCE
, которое Integer.MAX_VALUE
. Я не думаю, что существует способ быть на 100% уверенным, что он всегда будет вызван до Aspect3
. Я считаю, что это зависит от порядка сканирования компонентов.
Если вы хотите быть уверены, вы можете поместить в точные значения:
@Order(1)
public class Aspect1 {...}
@Order(2)
public class Aspect2 {...}
@Order(3)
public class Aspect3 {...}
Или просто поставить значение между Integer.MIN_VALUE
и Integer.MAX_VALUE
на Aspect2
:
@Order(0)
public class Aspect2 {...}
Здесь также тест, который подтверждает это:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes =
{Class1.class, Class3.class, Class2.class})
public class TestTest {
public static interface Test {}
@Order(Ordered.HIGHEST_PRECEDENCE)
@Component
public static class Class1 implements Test {}
@Order
@Component
public static class Class2 implements Test {}
@Order(Ordered.LOWEST_PRECEDENCE)
@Component
public static class Class3 implements Test {}
@Autowired
List<Test> list;
@Test
public void test() {
System.out.println("list: " + list);
}
}
Это выдает:
list: [[email protected], [email protected], [email protected]]
Но если вы измените порядок классов 2
и 3
в @SpringApplicationConfiguration
, Class2
будет вызван второй.
Спасибо, отличный ответ, но до сих пор неясно, какой будет порядок, если какой-то аспект будет без аннотации заказа. –
Вы не можете быть уверены, какой заказ будет. Это было бы так же, как если бы оба Aspect2 и Aspect3 имели '@Order (Ordered.LOWEST_PRECEDENCE)', и, следовательно, это зависит от порядка проверки (или определения) классов во время выполнения, но вы не должны полагаться на это в процессе производства. – jeremija