Статьи

Весенняя коллекция слияния

Весеннее слияние коллекций — это функция, с которой я впервые столкнулся в ответ на вопрос StackOverflow

Это способ создания базовой коллекции (списка, набора, карты или свойств) и изменения этой базовой коллекции в других bean-компонентах, лучше всего объяснить на примере —

Рассмотрим класс Person с полем, содержащим список адресов:

1
2
3
4
public class Person {
 private List<Address> addresses;
..
}

Предположим, что все экземпляры Person имеют общий набор адресов, который можно указать с помощью абстрактного bean-компонента следующим образом:

1
2
3
4
5
6
7
8
9
<bean name='basePerson' class='Person' abstract='true'>
 <property name='addresses'>
  <list>
   <bean class='Address' p:street='Street1' p:state='State1' p:zip='001'></bean>
   <bean class='Address' p:street='Street2' p:state='State2' p:zip='002'></bean>
   <bean class='Address' p:street='Street3' p:state='State3' p:zip='003'></bean>
  </list>
 </property>
</bean>

Теперь экземпляры bean-объектов Person с адресами в дополнение к адресам из basePerson могут быть заданы с помощью функции слияния коллекций следующим образом — обратите внимание на атрибут списка «слияние»:

1
2
3
4
5
6
7
<bean name='person1' class='Person' parent='basePerson'>
 <property name='addresses'>
  <list merge='true'>
   <bean class='Address' p:street='Street4' p:state='State4' p:zip='004'></bean>
  </list>
 </property>
</bean>

Объединение коллекций также работает с <set />, <map /> и <props />

В Spring 3.1 и выше, более простой вариант может заключаться в простом использовании параметров @Configuraion и @Bean, так как тогда слияние может быть напрямую обработано с помощью кода Java, например, для эквивалентной конфигурации @Configuration для вышеупомянутой конфигурации bean-компонента xml:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
@Configuration
public class CollectionConfig{
  
 private List<Address> baseAddresses(){
  return Lists.newArrayList(new Address('Street1', 'State1', '001'), new Address('Street2', 'State2', '002'), new Address('Street3', 'State3', '003'));
 }
  
  
 @Bean
 public Person person1(){
  Person person1 = new Person();
  person1.setAddresses(baseAddresses());
  person1.getAddresses().add(new Address('Street4', 'State4', '004'));
  return person1;
 }
}

Ссылка: Spring Collection Слияние с нашим партнером JCG Биджу Кунджумменом в блоге all and sundry.