1. Обзор
В этом уроке мы узнаем об аннотации Spring @Order . Аннотация @Order определяет порядок сортировки аннотированного компонента или компонента.
Он имеет необязательный аргумент value, который определяет порядок компонента; значение по умолчанию – Ordered.LOWEST_PRECEDENCE . Это означает, что компонент имеет самый низкий приоритет среди всех других упорядоченных компонентов.
Аналогично, значение Упорядочено.HIGHEST_PRECEDENCE может использоваться для переопределения самого высокого приоритета среди компонентов.
2. Когда использовать @Order
До Spring 4.0 аннотация @Order использовалась только для заказа на выполнение AspectJ. Это означает, что совет высшего порядка будет работать первым.
Начиная с Spring 4.0, он поддерживает упорядочение введенных компонентов в коллекцию. В результате Spring введет автоматически подключенные бобы того же типа на основе их значения заказа.
Давайте рассмотрим это на коротком примере.
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 Listratings; @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 .