1. введение
В этом уроке мы покажем, как вводить Java коллекции с помощью Spring framework .
Проще говоря, мы продемонстрируем примеры с интерфейсами List, Map, Set collection.
2. Список С @Autowired
Давайте создадим пример боба:
public class CollectionsBean {
@Autowired
private List nameList;
public void printNameList() {
System.out.println(nameList);
}
} Здесь мы объявили свойство name List для хранения Списка значений String .
В этом примере мы используем инъекцию поля для nameList . Поэтому мы помещаем @Autowired аннотацию .
Чтобы узнать больше о внедрении зависимостей или различных способах его реализации, ознакомьтесь с этим руководством .
После этого мы регистрируем CollectionsBean в классе настройки конфигурации:
@Configuration
public class CollectionConfig {
@Bean
public CollectionsBean getCollectionsBean() {
return new CollectionsBean();
}
@Bean
public List nameList() {
return Arrays.asList("John", "Adam", "Harry");
}
} Помимо регистрации компонента Collections , мы также вводим новый список, явно инициализируя и возвращая его как отдельную конфигурацию @Bean .
Теперь мы можем проверить результаты:
ApplicationContext context = new AnnotationConfigApplicationContext(CollectionConfig.class); CollectionsBean collectionsBean = context.getBean( CollectionsBean.class); collectionsBean.printNameList();
Вывод метода print NameList():
[John, Adam, Harry]
3. Набор С Инъекцией Конструктора
Чтобы настроить тот же пример с коллекцией Set , давайте изменим класс Collections Bean :
public class CollectionsBean {
private Set nameSet;
public CollectionsBean(Set strings) {
this.nameSet = strings;
}
public void printNameSet() {
System.out.println(nameSet);
}
} На этот раз мы хотим использовать инъекцию конструктора для инициализации набора имен свойства . Это также требует изменений в классе конфигурации:
@Bean
public CollectionsBean getCollectionsBean() {
return new CollectionsBean(new HashSet<>(Arrays.asList("John", "Adam", "Harry")));
}4. Карта С Инъекцией Сеттера
Следуя той же логике, давайте добавим поле name Map , чтобы продемонстрировать внедрение карты:
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 MapnameMap(){ Map nameMap = new HashMap<>(); nameMap.put(1, "John"); nameMap.put(2, "Adam"); nameMap.put(3, "Harry"); return nameMap; }
Результаты после вызова метода print Name Map() :
{1=John, 2=Adam, 3=Harry}5. Инъекционные ссылки на бобы
Давайте рассмотрим пример, в котором мы вводим ссылки на бобы в качестве элементов коллекции.
Во – первых, давайте создадим боб:
public class BaeldungBean {
private String name;
// constructor
}И добавьте List of 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
}Пружинный контейнер впрыскивает отдельные бобы BaeldungBean введите в одну коллекцию.
Чтобы проверить это, мы вызываем метод collectionsBean.printBeanList () . Выходные данные показывают имена компонентов в виде элементов списка:
[John, Harry, Adam]
Теперь, давайте рассмотрим сценарий, когда нет BaeldungBean . Если в applicationcontext не зарегистрирован BaeldungBean , Spring выдаст исключение из-за отсутствия требуемой зависимости.
Мы можем использовать @Autowired(обязательно) , чтобы пометить зависимость как необязательную. Вместо того, чтобы создавать исключение, список bean не будет инициализирован, и его значение останется null .
Если нам нужен пустой список вместо null, мы можем инициализировать bean List с помощью нового ArrayList:
@Autowired(required = false) private ListbeanList = 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");
}
}Spring container сначала введет боб с именем “Гарри” , так как он имеет наименьшее значение порядка.
Затем он введет “Джон”, и, наконец, “Адам” боб:
[Harry, John, Adam]
Узнайте больше о @Order в этом руководстве .
5.2. Использование @Квалификатора для выбора бобов
Мы можем использовать @Квалификатор чтобы выбрать бобы, которые будут введены в конкретную коллекцию, соответствующую @Квалификатор имя.
Вот как мы используем его для точки впрыска:
@Autowired
@Qualifier("CollectionsBean")
private List beanList; Затем мы помечаем тем же @квалификатором бобы, которые мы хотим ввести в Список :
@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
}В этом примере мы указываем, что боб с именем “John” будет введен в Список с именем “Collections Bean” . Результаты, которые мы тестируем здесь:
ApplicationContext context = new AnnotationConfigApplicationContext(CollectionConfig.class); CollectionsBean collectionsBean = context.getBean(CollectionsBean.class); collectionsBean.printBeanList();
Из выходных данных мы видим, что в нашей коллекции есть только один элемент:
[John]
6. Установка пустого списка в качестве значения по умолчанию
Мы можем установить значение по умолчанию для введенного свойства списка как пустой список с помощью статического метода 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 .