복붙노트

[SPRING] 스프링 컬렉션 병합

SPRING

스프링 컬렉션 병합

나는 FactoryBean으로 생성 된 두리스트를 가지고 있는데,이 두가지의 병합 된 버전으로 bean을 초기화하고 싶습니다. 이 일을하는 방법이 있습니까?

<bean id="listA" class="XFactoryBean" >
  ...
</bean>
<bean id="listB" class="YFactoryBean">
  ...
</bean>
<bean >
  <property name="AwithB" ...>
</bean>

정적 목록 (http://vikdor.blogspot.hu/2012/10/using-collection-merging-in-spring-to.html)과 함께 작동하는 솔루션이 있지만 생성 된 목록에서는 작동하지 않습니다.

해결법

  1. ==============================

    1.Java @Configuration FTW :

    Java @Configuration FTW :

    @Configuration
    public class Config {
    
        @Resource
        private List listA;
    
        @Resource
        private List listB;
    
        @Bean
        public List AwithB() {
            List mergedList = new ArrayList(listA);
            listB.addAll(listB);
            return mergedList;
        }
    
    }
    

    훨씬 더 적은 상용구.

  2. ==============================

    2.위의 ListMergerFactoryBean 솔루션에는 미묘한 버그가 있습니다.

    위의 ListMergerFactoryBean 솔루션에는 미묘한 버그가 있습니다.

    구성 :

    <util:list id="listA" value-type="java.lang.String">
      <value>fooA</value>
      <value>barA</value>
    </util:list>
    <util:list id="listB" value-type="java.lang.String">
      <value>fooB</value>
      <value>barB</value>
    </util:list>
    <util:list id="listC" value-type="java.lang.String">
      <value>fooC</value>
      <value>barC</value>
    </util:list>
    <bean id="AwithB" class="com.util.ListMergerFactoryBean">
      <property name="listOfLists">
        <list>
            <ref bean="listA" />
            <ref bean="listB" />
        </list>
      </property>
    </bean>
    <bean id="AwithC" class="com.util.ListMergerFactoryBean">
      <property name="listOfLists">
        <list>
            <ref bean="listA" />
            <ref bean="listC" />
        </list>
      </property>
    </bean>
    

    이 설정을 사용하면 bean AwithB가 AwithC의 예상 내용을 가지고있을 때 놀랄 수 있습니다. ListA는 싱글 톤이며 getObject 메소드는이를 변경하여 Bean 팩토리가 싱글 톤이 아니더라도 ListMergerFactoryBean의 모든 사용자에 대해이를 변경합니다. 이 문제는 listOfLists의 첫 번째 목록을 다시 사용하지 않는 것입니다.

    @Override
    public List getObject() throws Exception {
      List mergedList = new ArrayList();
      for (List list : listOfLists) {
        mergedList.addAll(list);
      }
      return mergedList;
    }
    
  3. ==============================

    3.SpEL 관련 솔루션 (Spring 구성에서 목록을 확장하는 방법)과 ListFactoryBean을 확장 한 후 (http://ericlefevre.net/wordpress/2008/04/02/merging-lists-in-a-spring-configuration- file /) 다음 해결책을 생각해 냈습니다.

    SpEL 관련 솔루션 (Spring 구성에서 목록을 확장하는 방법)과 ListFactoryBean을 확장 한 후 (http://ericlefevre.net/wordpress/2008/04/02/merging-lists-in-a-spring-configuration- file /) 다음 해결책을 생각해 냈습니다.

    config :

    <bean id="AwithB" class="com.util.ListMergerFactoryBean">
        <property name="listOfLists">
            <list>
                <ref bean="listA" />
                <ref bean="listB" />
            </list>
        </property>
    </bean>
    

    자바:

    public class ListMergerFactoryBean implements FactoryBean<List> {
    
    private List<List> listOfLists;
    
    @Override
    public List getObject() throws Exception {
        List mergedList = new ArrayList();
        for (List list : listOfLists) {
                mergedList.addAll(list);
        }
        return mergedList;
    }
    
    @Override
    public Class<?> getObjectType() {
        return (new ArrayList()).getClass();
    }
    
    @Override
    public boolean isSingleton() {
        return false;
    }
    
    public void setListOfLists(List<List> listOfLists) {
        this.listOfLists = listOfLists;
    }
    

    }

    업데이트 : Aron Bartle의 솔루션을 사용하여 버그를 제거했습니다. 감사!

  4. from https://stackoverflow.com/questions/14520536/spring-collection-merge by cc-by-sa and MIT license