Рубрики
Без рубрики

Весенне – Инъекционные коллекции

Узнайте, как внедрять различные типы коллекций Java с помощью Spring framework.

Автор оригинала: baeldung.

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 Map nameMap(){
    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 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");
    }
}

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 .