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

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

1. обзор

В этом руководстве мы узнаем об аннотации Spring@Order. The @Order annotation defines the sorting order of an annotated component or bean.

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

Точно так же значениеOrdered.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 List 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  определяют порядок запуска одиночного экземпляра.

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