[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.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.위의 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.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의 솔루션을 사용하여 버그를 제거했습니다. 감사!
from https://stackoverflow.com/questions/14520536/spring-collection-merge by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] JSTL을 사용하여 Spring Controller에서 JSP로 Map에 액세스 할 때 오류 발생 (0) | 2019.04.30 |
---|---|
[SPRING] Spring Boot에서 MySql Database 쿼리를 사용하는 방법? (0) | 2019.04.30 |
[SPRING] Java 구성으로 Autowire setter 재정의 (0) | 2019.04.30 |
[SPRING] Oauth2 클라이언트 로그 아웃이 작동하지 않습니다. (0) | 2019.04.30 |
[SPRING] Spring 트랜잭션 전파 필수, REQUIRES_NEW (0) | 2019.04.30 |