컬렉션 주입
- 의존성 주입은 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;
}
}