Пролет - Инжекционни колекции

1. Въведение

В този урок ще покажем как да инжектирате Java колекции, използвайки Spring Spring .

Най-просто казано, ние ще демонстрираме примери с интерфейси за събиране на списък, карта, набор .

2. Списък с @Autowired

Нека създадем примерен боб:

public class CollectionsBean { @Autowired private List nameList; public void printNameList() { System.out.println(nameList); } }

Тук декларирахме свойството nameList да съдържа списък със стойности на низ .

В този пример използваме инжектиране на поле за nameList . Затова поставяме анотацията @Autowired .

За да научите повече за инжекцията на зависимостите или различните начини за нейното прилагане, разгледайте това ръководство.

След това регистрираме CollectionsBean в класа за настройка на конфигурацията:

@Configuration public class CollectionConfig { @Bean public CollectionsBean getCollectionsBean() { return new CollectionsBean(); } @Bean public List nameList() { return Arrays.asList("John", "Adam", "Harry"); } }

Освен регистрацията на CollectionsBean , ние също инжектираме нов списък, като изрично го инициализираме и връщаме като отделна @Bean конфигурация.

Сега можем да тестваме резултатите:

ApplicationContext context = new AnnotationConfigApplicationContext(CollectionConfig.class); CollectionsBean collectionsBean = context.getBean( CollectionsBean.class); collectionsBean.printNameList();

Резултатът от метода printNameList ():

[John, Adam, Harry]

3. Комплект с инжектор на конструктор

За да настроим същия пример с колекцията Set , нека модифицираме класа CollectionsBean :

public class CollectionsBean { private Set nameSet; public CollectionsBean(Set strings) { this.nameSet = strings; } public void printNameSet() { System.out.println(nameSet); } }

Този път искаме да използваме инжектор на конструктор за инициализиране на свойството nameSet . Това изисква също промени в конфигурационния клас:

@Bean public CollectionsBean getCollectionsBean() { return new CollectionsBean(new HashSet(Arrays.asList("John", "Adam", "Harry"))); }

4. Карта с инжектиране на сетер

Следвайки същата логика, нека добавим полето nameMap, за да демонстрираме инжектирането на картата:

public class CollectionsBean { private Map nameMap; @Autowired public void setNameMap(Map nameMap) { this.nameMap = nameMap; } public void printNameMap() { System.out.println(nameMap); } }

Този път имаме метод за настройка, за да използваме инжектиране на зависимост от сетер . Също така трябва да добавим инициализиращ код на Map в конфигурационен клас:

@Bean public Map nameMap(){ Map nameMap = new HashMap(); nameMap.put(1, "John"); nameMap.put(2, "Adam"); nameMap.put(3, "Harry"); return nameMap; }

Резултатите след извикване на метода printNameMap () :

{1=John, 2=Adam, 3=Harry}

5. Инжектиране на референции за боб

Нека да разгледаме пример, при който инжектираме препратки към боб като елементи от колекцията.

Първо, нека създадем боб:

public class BaeldungBean { private String name; // constructor }

И добавете Списък на BaeldungBean като свойство към класа CollectionsBean :

public class CollectionsBean { @Autowired(required = false) private List beanList; public void printBeanList() { System.out.println(beanList); } }

След това добавяме фабричните методи за конфигуриране на Java за всеки елемент BaeldungBean :

@Configuration public class CollectionConfig { @Bean public BaeldungBean getElement() { return new BaeldungBean("John"); } @Bean public BaeldungBean getAnotherElement() { return new BaeldungBean("Adam"); } @Bean public BaeldungBean getOneMoreElement() { return new BaeldungBean("Harry"); } // other factory methods }

Контейнерът Spring инжектира отделните зърна от типа BaeldungBean в една колекция.

За да тестваме това, извикваме метода collectionBean.printBeanList () . Резултатът показва имената на зърната като елементи от списъка:

[John, Harry, Adam]

Сега, нека разгледаме сценарий, когато няма BaeldungBean . Ако в контекста на приложението не е регистриран BaeldungBean , Spring ще изведе изключение, защото липсва необходимата зависимост.

Можем да използваме @Autowired (задължително = невярно), за да маркираме зависимостта като незадължителна. Вместо да хвърля изключение, beanList няма да бъде инициализиран и стойността му ще остане нула .

Ако се нуждаем от празен списък вместо null, можем да инициализираме beanList с нов ArrayList:

@Autowired(required = false) private List beanList = new ArrayList();

5.1. Използване на @Order за сортиране на боб

Можем да посочим реда на зърната, докато инжектираме в колекцията .

За тази цел използваме анотацията @Order и посочваме индекса:

@Configuration public class CollectionConfig { @Bean @Order(2) public BaeldungBean getElement() { return new BaeldungBean("John"); } @Bean @Order(3) public BaeldungBean getAnotherElement() { return new BaeldungBean("Adam"); } @Bean @Order(1) public BaeldungBean getOneMoreElement() { return new BaeldungBean("Harry"); } }

Пролетният контейнер първо ще инжектира зърното с името „Хари“ , тъй като има най-ниската стойност на поръчката.

It will then inject the “John”, and finally, the “Adam” bean:

[Harry, John, Adam]

Learn more about @Order in this guide.

5.2. Using @Qualifier to Select Beans

We can use the @Qualifier to select the beans to be injected into the specific collection that matches the @Qualifier name.

Here's how we use it for the injection point:

@Autowired @Qualifier("CollectionsBean") private List beanList;

Then, we mark with the same @Qualifier the beans that we want to inject into the List:

@Configuration public class CollectionConfig { @Bean @Qualifier("CollectionsBean") public BaeldungBean getElement() { return new BaeldungBean("John"); } @Bean public BaeldungBean getAnotherElement() { return new BaeldungBean("Adam"); } @Bean public BaeldungBean getOneMoreElement() { return new BaeldungBean("Harry"); } // other factory methods }

In this example, we specify that the bean with the name “John” will be injected into the List named “CollectionsBean”. The results we test here:

ApplicationContext context = new AnnotationConfigApplicationContext(CollectionConfig.class); CollectionsBean collectionsBean = context.getBean(CollectionsBean.class); collectionsBean.printBeanList();

От резултата виждаме, че нашата колекция има само един елемент:

[John]

6. Задаване на празен списък като стойност по подразбиране

Можем да зададем стойността по подразбиране за инжектирано свойство List като празен списък, като използваме статичния метод Collections.emptyList () :

public class CollectionsBean { @Value("${names.list:}#{T(java.util.Collections).emptyList()}") private List nameListWithDefaultValue; public void printNameListWithDefaults() { System.out.println(nameListWithDefaultValue); } }

Ако стартираме това с ключа „names.list“, който не е инициализиран чрез файла със свойства:

collectionsBean.printNameListWithDefaults();

Ще получим празен списък като изход:

[ ]

7. Обобщение

С това ръководство научихме как да инжектираме различни типове Java колекции, използвайки Spring framework.

Също така изследвахме инжектирането с референтни типове и как да ги подберем или поръчаме вътре в колекцията.

Както обикновено, пълният код е достъпен в проекта GitHub.