- Весна — впрыскивание коллекций
- 2. List с@Autowired
- 3. Set с внедрением конструктора
- 4. Map с впрыском через сеттер
- 5. Внедрение ссылок на бин
- 5.1. Использование@Order для сортировки бобов
- 5.2. Использование@Qualifier для выбора фасоли
- Spring – Внедрение коллекций
- 2. Список с @Autowired
- 3. Установить с внедрением конструктора
- 4. Карта с внедрением сеттера
- 5. Внедрение ссылок на компоненты
- 5.1. Использование @Order для сортировки компонентов
- 5.2. Использование @Qualifier для выбора компонентов
- 6. Установка пустого списка в качестве значения по умолчанию
Весна — впрыскивание коллекций
В этом уроке мы покажем, какinject Java collections using the Spring framework.
Проще говоря, мы продемонстрируем примеры с интерфейсами сбораList, Map, Set.
2. List с@Autowired
Давайте создадим пример bean-компонента:
public class CollectionsBean < @Autowired private ListnameList; public void printNameList() < System.out.println(nameList); >>
Здесь мы объявили свойствоnameList для храненияList значенийString.
In this example, we use field injection for nameList. Therefore, we put the @Autowired annotation.
Чтобы узнать больше о внедрении зависимостей или различных способах ее реализации, ознакомьтесь с этимguide.
После этого мы регистрируем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 ():
3. Set с внедрением конструктора
Чтобы настроить тот же пример с коллекциейSet, давайте изменим классCollectionsBean :
public class CollectionsBean < private SetnameSet; public CollectionsBean(Set strings) < this.nameSet = strings; >public void printNameSet() < System.out.println(nameSet); >>
This time we want to use a constructor injection for initializing the nameSet property. Это требует также изменений в классе конфигурации:
@Bean public CollectionsBean getCollectionsBean() < return new CollectionsBean(new HashSet<>(Arrays.asList("John", "Adam", "Harry"))); >
4. Map с впрыском через сеттер
Следуя той же логике, давайте добавим поле nameMap, чтобы продемонстрировать внедрение карты:
public class CollectionsBean < private MapnameMap; @Autowired public void setNameMap(Map nameMap) < this.nameMap = nameMap; >public void printNameMap() < System.out.println(nameMap); >>
На этот разwe have a setter method in order to use a setter dependency injection. Нам также необходимо добавить код инициализацииMap в класс конфигурации:
@Bean public Map nameMap() < MapnameMap = new HashMap<>(); nameMap.put(1, "John"); nameMap.put(2, "Adam"); nameMap.put(3, "Harry"); return nameMap; >
Результаты после вызова методаprintNameMap():
5. Внедрение ссылок на бин
Давайте посмотрим на пример, в котором мы внедряем ссылки на компоненты как элементы коллекции.
Сначала давайте создадим bean-компонент:
И добавьтеList изexampleBean в качестве свойства в классCollectionsBean :
public class CollectionsBean < @Autowired(required = false) private ListbeanList; public void printBeanList() < System.out.println(beanList); >>
Затем мы добавляем фабричные методы конфигурации Java для каждого элементаexampleBean:
@Configuration public class CollectionConfig < @Bean public exampleBean getElement() < return new exampleBean("John"); >@Bean public exampleBean getAnotherElement() < return new exampleBean("Adam"); >@Bean public exampleBean getOneMoreElement() < return new exampleBean("Harry"); >// other factory methods >
Контейнер Spring вставляет отдельные bean-компоненты типаexampleBean в одну коллекцию.
Чтобы проверить это, мы вызываем методcollectionsBean.printBeanList(). Выходные данные показывают имена компонентов в виде элементов списка:
Теперьlet’s consider a scenario when there is not a exampleBean. Если в контексте приложения не зарегистрированexampleBean, Spring выдаст исключение, поскольку требуемая зависимость отсутствует.
Мы можем использовать@Autowired(required = false), чтобы пометить зависимость как необязательную. Вместо выдачи исключенияbeanList не будет инициализирован, а его значение останетсяnull.
Если нам нужен пустой список вместоnull,, мы можем инициализироватьbeanList новымArrayList:
@Autowired(required = false) private List beanList = new ArrayList<>();
5.1. Использование@Order для сортировки бобов
We can specify the order of the beans while injecting into the collection.
Для этого мы используем аннотацию@Order и указываем индекс:
@Configuration public class CollectionConfig < @Bean @Order(2) public exampleBean getElement() < return new exampleBean("John"); >@Bean @Order(3) public exampleBean getAnotherElement() < return new exampleBean("Adam"); >@Bean @Order(1) public exampleBean getOneMoreElement() < return new exampleBean("Harry"); >>
Spring container first will inject the bean with the name “Harry”, так как он имеет наименьшее значение порядка.
Затем он внедрит“John”, и, наконец, bean-компонент“Adam”:
Узнайте больше о@Order в этомguide.
5.2. Использование@Qualifier для выбора фасоли
Мы можем использовать@Qualifier для выбора bean-компонентов, которые будут вставлены в конкретную коллекцию, которая соответствует имени@Qualifier.
Вот как мы используем его для точки инъекции:
@Autowired @Qualifier("CollectionsBean") private List beanList;
Затем мы помечаем тем же@Qualifier бины, которые мы хотим внедрить вList:
@Configuration public class CollectionConfig < @Bean @Qualifier("CollectionsBean") public exampleBean getElement() < return new exampleBean("John"); >@Bean public exampleBean getAnotherElement() < return new exampleBean("Adam"); >@Bean public exampleBean getOneMoreElement() < return new exampleBean("Harry"); >// other factory methods >
В этом примере мы указываем, что компонент с именем“John” will будет внедрен вList с именем“CollectionsBean”. Результаты мы тестируем здесь:
ApplicationContext context = new AnnotationConfigApplicationContext(CollectionConfig.class); CollectionsBean collectionsBean = context.getBean(CollectionsBean.class); collectionsBean.printBeanList();
Из вывода мы видим, что наша коллекция имеет только один элемент:
Spring – Внедрение коллекций
В этом руководстве мы собираемся показать, как внедрять коллекции Java с помощью среды Spring .
Проще говоря, мы продемонстрируем примеры с интерфейсами коллекции List, Map, Set .
2. Список с @Autowired
Давайте создадим пример bean-компонента:
public class CollectionsBean @Autowired private ListString> 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 ListString> nameList() return Arrays.asList("John", "Adam", "Harry"); > >
Помимо регистрации CollectionsBean , мы также вводим новый список, явно инициализируя и возвращая его как отдельную конфигурацию @Bean .
Теперь мы можем проверить результаты:
ApplicationContext context = new AnnotationConfigApplicationContext(CollectionConfig.class); CollectionsBean collectionsBean = context.getBean( CollectionsBean.class); collectionsBean.printNameList();
Вывод метода printNameList():
3. Установить с внедрением конструктора
Чтобы настроить тот же пример с коллекцией Set , давайте изменим класс CollectionsBean :
public class CollectionsBean private SetString> nameSet; public CollectionsBean(SetString> 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 MapInteger, String> nameMap; @Autowired public void setNameMap(MapInteger, String> nameMap) this.nameMap = nameMap; > public void printNameMap() System.out.println(nameMap); > >
На этот раз у нас есть метод setter, чтобы использовать инъекцию зависимостей setter . Нам также нужно добавить код инициализации карты в класс конфигурации:
@Bean public MapInteger, String> nameMap() MapInteger, String> nameMap = new HashMap>(); nameMap.put(1, "John"); nameMap.put(2, "Adam"); nameMap.put(3, "Harry"); return nameMap; >
Результаты после вызова метода printNameMap() :
5. Внедрение ссылок на компоненты
Давайте рассмотрим пример, в котором мы вводим ссылки на bean-компоненты как элементы коллекции.
Во-первых, давайте создадим bean-компонент:
public class ForEachBean private String name; // constructor >
И добавьте список ForEachBean в качестве свойства в класс CollectionsBean :
public class CollectionsBean @Autowired(required = false) private ListForEachBean> beanList; public void printBeanList() System.out.println(beanList); > >
Затем мы добавляем фабричные методы конфигурации Java для каждого элемента ForEachBean :
@Configuration public class CollectionConfig @Bean public ForEachBean getElement() return new ForEachBean("John"); > @Bean public ForEachBean getAnotherElement() return new ForEachBean("Adam"); > @Bean public ForEachBean getOneMoreElement() return new ForEachBean("Harry"); > // other factory methods >
Контейнер Spring внедряет отдельные компоненты типа ForEachBean в одну коллекцию.
Чтобы проверить это, мы вызываем метод collectionsBean.printBeanList() . Вывод показывает имена bean-компонентов в виде элементов списка:
Теперь давайте рассмотрим сценарий, когда ForEachBean отсутствует . Если в контексте приложения не зарегистрирован ForEachBean , Spring выдаст исключение из-за отсутствия требуемой зависимости.
Мы можем использовать @Autowired(required = false) , чтобы пометить зависимость как необязательную. Вместо создания исключения beanList не будет инициализирован, и его значение останется нулевым .
Если нам нужен пустой список вместо null, мы можем инициализировать beanList новым ArrayList:
@Autowired(required = false) private ListForEachBean> beanList = new ArrayList>();
5.1. Использование @Order для сортировки компонентов
Мы можем указать порядок bean-компонентов при внедрении в коллекцию .
Для этого используем аннотацию @Order и указываем индекс:
@Configuration public class CollectionConfig @Bean @Order(2) public ForEachBean getElement() return new ForEachBean("John"); > @Bean @Order(3) public ForEachBean getAnotherElement() return new ForEachBean("Adam"); > @Bean @Order(1) public ForEachBean getOneMoreElement() return new ForEachBean("Harry"); > >
Контейнер Spring сначала введет bean-компонент с именем «Harry» , так как он имеет наименьшее значение порядка.
Затем он внедрит бин «John» и, наконец, бин «Adam» :
Узнайте больше о @Order в этом руководстве .
5.2. Использование @Qualifier для выбора компонентов
Мы можем использовать @Qualifier , чтобы выбрать bean-компоненты для внедрения в конкретную коллекцию, которая соответствует имени @Qualifier .
Вот как мы используем его для точки впрыска:
@Autowired @Qualifier("CollectionsBean") private ListForEachBean> beanList;
Затем мы помечаем тем же @Qualifier bean-компоненты, которые мы хотим внедрить в список :
@Configuration public class CollectionConfig @Bean @Qualifier("CollectionsBean") public ForEachBean getElement() return new ForEachBean("John"); > @Bean public ForEachBean getAnotherElement() return new ForEachBean("Adam"); > @Bean public ForEachBean getOneMoreElement() return new ForEachBean("Harry"); > // other factory methods >
В этом примере мы указываем, что bean-компонент с именем «John» будет внедрен в список с именем «CollectionsBean» . Результаты, которые мы тестируем здесь:
ApplicationContext context = new AnnotationConfigApplicationContext(CollectionConfig.class); CollectionsBean collectionsBean = context.getBean(CollectionsBean.class); collectionsBean.printBeanList();
Из вывода мы видим, что наша коллекция имеет только один элемент:
6. Установка пустого списка в качестве значения по умолчанию
Мы можем установить значение по умолчанию для введенного свойства List как пустой список, используя статический метод Collections.emptyList() :
public class CollectionsBean @Value("$#") private ListString> nameListWithDefaultValue; public void printNameListWithDefaults() System.out.println(nameListWithDefaultValue); > >
Если мы запустим это с ключом «names.list», не инициализированным через файл свойств:
collectionsBean.printNameListWithDefaults();
На выходе мы получим пустой список: