Перейти к основному содержимому

@Заказ весной

· 2 мин. чтения

1. Обзор

В этом уроке мы узнаем об аннотации Spring @Order . Аннотация @Order определяет порядок сортировки аннотированного компонента или компонента. ``

Он имеет необязательный аргумент значения, который определяет порядок компонента; значение по умолчанию — Ordered.LOWEST_PRECEDENCE . Это означает, что компонент имеет самый низкий приоритет среди всех других упорядоченных компонентов.

Точно так же значение Ordered.HIGHEST_PRECEDENCE можно использовать для переопределения наивысшего приоритета среди компонентов.

2. Когда использовать @Order

До Spring 4.0 аннотация @Order использовалась только для порядка выполнения AspectJ. Это означает, что совет самого высокого порядка будет выполняться первым.

Начиная с Spring 4.0, он поддерживает упорядочение внедренных компонентов в коллекции. В результате Spring будет внедрять автосвязанные bean-компоненты одного и того же типа в зависимости от их порядкового значения.

Давайте рассмотрим это на быстром примере.

3. Как использовать @Order

Прежде всего, давайте настроим наш проект с соответствующим интерфейсом и классами.

3.1. Создание интерфейса

Создадим интерфейс Rating , определяющий рейтинг товара:

public interface Rating {
int getRating();
}

3.2. Создание компонентов

Наконец, давайте создадим три компонента, которые определяют рейтинги некоторых продуктов:

@Component
@Order(1)
public class Excellent implements Rating {

@Override
public int getRating() {
return 1;
}
}

@Component
@Order(2)
public class Good implements Rating {

@Override
public int getRating() {
return 2;
}
}

@Component
@Order(Ordered.LOWEST_PRECEDENCE)
public class Average implements Rating {

@Override
public int getRating() {
return 3;
}
}

Обратите внимание, что класс Average имеет самый низкий приоритет из-за его переопределенного значения.

4. Тестирование нашего примера

На данный момент мы создали все необходимые компоненты и интерфейс для тестирования аннотации @Order . Теперь давайте проверим его, чтобы убедиться, что он работает так, как ожидалось:

public class RatingRetrieverUnitTest { 

@Autowired
private List<Rating> ratings;

@Test
public void givenOrder_whenInjected_thenByOrderValue() {
assertThat(ratings.get(0).getRating(), is(equalTo(1)));
assertThat(ratings.get(1).getRating(), is(equalTo(2)));
assertThat(ratings.get(2).getRating(), is(equalTo(3)));
}
}

5. Вывод

Мы узнали об аннотации @Order в этой быстрой статье. Мы можем найти применение @Order в различных случаях использования, где имеет значение порядок автоматически подключаемых компонентов. Одним из примеров являются фильтры запросов Spring.

Из-за его влияния на приоритет внедрения может показаться, что он также может повлиять на порядок запуска синглтона. Но, напротив, отношения зависимости и объявления @DependsOn определяют порядок запуска синглтона.

Все примеры, упомянутые в этом руководстве, можно найти на Github .