2015-05-11 2 views
0

Что бы порядок вызовов на «пути в», если у меня есть 3 такие аспекты, как:Spring аспект заказа

@Order(Ordered.HIGHEST_PRECEDENCE) 
public class Aspect1 

public class Aspect2 

@Order(Ordered.LOWEST_PRECEDENCE) 
public class Aspect3 

так Aspect2 не имеет аннотацию заказа.

Понятно, что Aspect1 будет вызываться перед Aspect3, но означает ли это, что Aspect2 будет всегда вызываться между ними?

ответ

0

С официального 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 будет вызван второй.

+0

Спасибо, отличный ответ, но до сих пор неясно, какой будет порядок, если какой-то аспект будет без аннотации заказа. –

+0

Вы не можете быть уверены, какой заказ будет. Это было бы так же, как если бы оба Aspect2 и Aspect3 имели '@Order (Ordered.LOWEST_PRECEDENCE)', и, следовательно, это зависит от порядка проверки (или определения) классов во время выполнения, но вы не должны полагаться на это в процессе производства. – jeremija

Смежные вопросы