Spring - Collection 주입

 

List, Set, Map, Properties 등 Collection 주입하는 방법

컬렉션 주입

  • 의존성 주입은 bean이나 개별 값이 아닌 컬렉션도 가능하다.
  • List, Map, Set, Properties 등이 주입 가능하며 각각 , <map>, , 태그를 사용한다.
  • Properties는 String 값만 사용 가능하다.
  • List, Map, Set 등은 서로 포함할 수 있다(List에 여려 Map을 담거나 Map에 여러 Set을 담는 등).
  • 원시값의 컬렉션 뿐만 아니라 bean으로 이루어진 컬렉션이나 다른 컬렉션으로 이루어진 컬렉션도 주입이 가능하여 애플리케이션을 모듈화 하기 쉽다.
public class CollectionInjection {

	private Map<String, Object> map;
	private Properties props;
	private Set set;
	private List list;

	...

	public void setMap(Map<String, Object> map) {
		this.map = map;
	}

	public void setProps(Properties props) {
		this.props = props;
	}

	public void setSet(Set set) {
		this.set = set;
	}

	public void setList(List list) {
		this.list = list;
	}
}
<beans ...>
	<bean id="lyricHolder"
		  class="com.apress...LyricHolder" />

	<bean id="injectCollection"
		  class="com.apress... CollectionInjection">
		<property name="map">
			<map>
				<!-- map은 entry 태그를 이용하여 키와 값 추가 -->
				<!-- 주석 내의 표현으로 대체 가능 -->
				<!--
				<entry key="someValue" value="It's a Friday, we finally made it" />
				<entry key="someBean" value-ref="lyricHolder" />
				-->
				<entry key="someValue">
					<value>It's a Friday, we finally made it</value>
				</entry>
				<entry key="someBean">
					<ref bean="lyricHolder" />
				</entry>
			</map>
		</property>
		<property name="props">
			<mprops>
				<!-- mprops는 문자열 키와 값만 사용 가능 -->
				<prop key="firstName">John</prop>
				<prop key="secondName">Mayer</prop>
			</props>
		</property>
		<property name="set">
			<set>
				<value>It's a Friday, we finally made it</value>
				<ref bean="lyricHolder" />
			</set>
		</property>
		<property name="list">
			<list>
				<value>It's a Friday, we finally made it</value>
				<ref bean="lyricHolder" />
			</list>
		</property>
	</bean>
</beans>

애노테이션을 이용한 컬렉션 주입

  • @Autowired 애노테이션은 컬렉션에 들어있는 value의 타입에서 파생된 대상 빈을 가져와서 처리한다. 만일 List라는 속성이 클래스 내에 있다면 List를 처리하는 것이 아니라 현재의 ApplicationContext 내에 있는 모든 ContentHoler를 가져와 처리한다.
  • 만일 @Autowired 애노테이션을 사용하고자 한다면 @Qualifier 애노테이션과 함께 사용해야 한다.
<beans ...>

	<context:component-scan base-package="com.apress..." />

	<!-- 컬렉션 프로퍼티를 저장하는 bean 선언을 위해 util 네임스페이스 사용 -->
	<util:map id="map" map-class="java.util.HashMap">
		<entry key="someValue" value="It's a Friday, we finally made it" />
		<entry key="someBean" value-ref="lyricHolder" />
	<util:map>

	<util:properties id="props">
		<prop key="firstName">John</prop>
		<prop key="secondName">Mayer</prop>
	<util: properties>

	<util:set id="set" set-class="java.util.HashSet">
		<value>It's a Friday, we finally made it</value>
		<ref bean="lyricHolder" />
	<util:set>

	<util:list id="list" list-class="java.util.ArrayList">
		<value>It's a Friday, we finally made it</value>
		<ref bean="lyricHolder" />
	<util:list>
</beans>
@Service("injectCollection")
public class CollectionInjection {

	@Resource(name="map")
	private Map<String, Object> map;

	@Resource(name="props")
	private Properties props;

	@Resource(name="set")
	private Set set;

	@Resource(name="list")
	private List list;

	// 만일 @Autowired 애노테이션을 사용하고자 한다면 아래와 같이 @Qualifier 애노테이션과
  // 함께 사용해야 한다.

	// @Autowired
  // @Qualifier("map")
	// private Map<String, Object> map;

	...

	public void setMap(Map<String, Object> map) {
		this.map = map;
	}

	public void setProps(Properties props) {
		this.props = props;
	}

	public void setSet(Set set) {
		this.set = set;
	}

	public void setList(List list) {
		this.list = list;
	}
}