1. введение
В этом уроке мы покажем, как вводить Java коллекции с помощью Spring framework .
Проще говоря, мы продемонстрируем примеры с интерфейсами List, Map, Set collection.
2. Список С @Autowired
Давайте создадим пример боба:
public class CollectionsBean { @Autowired private ListnameList; 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 ListnameList() { 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 SetnameSet; 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 MapnameMap; @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 ListbeanList; 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 ListbeanList;
Затем мы помечаем тем же @квалификатором бобы, которые мы хотим ввести в Список :
@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 ListnameListWithDefaultValue; public void printNameListWithDefaults() { System.out.println(nameListWithDefaultValue); } }
Если мы запустим это с ключом “names.list”, не инициализированным через файл свойств:
collectionsBean.printNameListWithDefaults();
В качестве вывода мы получим пустой список:
[ ]
7. Резюме
В этом руководстве мы узнали, как внедрять различные типы коллекций Java с помощью Spring framework.
Мы также рассмотрели инъекции со ссылочными типами и то, как выбрать или упорядочить их внутри коллекции.
Как обычно, полный код доступен в проекте GitHub .