1. Общ преглед
В този урок ще научим за анотацията @Order на Spring . В @Order анотацията определя реда на подреждане с обяснителни бележки, компонент или боб.
Той има незадължителен аргумент за стойност, който определя реда на компонента; стойността по подразбиране е Подредена.LOWEST_PRECEDENCE . Това означава, че компонентът има най-ниския приоритет сред всички други подредени компоненти.
По същия начин стойността Ordered.HIGHEST_PRECEDENCE може да се използва за заменяне на най-високия приоритет сред компонентите.
2. Кога да използвате @Order
Преди пролет 4.0 анотацията @Order се използваше само за реда за изпълнение на AspectJ. Това означава, че съветите от най-висок ред ще станат първи.
От пролет 4.0 той поддържа подреждането на инжектирани компоненти към колекция. В резултат Spring ще инжектира автоматично свързани кабели от същия тип въз основа на стойността на тяхната поръчка.
Нека да го изследваме с бърз пример.
3. Как да използвам @Order
Първо, нека настроим нашия проект със съответния интерфейс и класове.
3.1. Създаване на интерфейс
Нека създадем интерфейс за оценка, който определя рейтинга на даден продукт:
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; } }
Обърнете внимание, че средният клас има най-ниския приоритет поради неговата отменена стойност.
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 определят реда за стартиране на единичен модел .
Всички примери, споменати в този урок, могат да бъдат намерени в Github.