반응형

Spring - Injecting Collection

 

(원문 위치 : http://www.tutorialspoint.com/spring/spring_injecting_collection.htm )


Bean 설정파일의 <property> 태그에서 기본 데이터 타입은 value속성을 객체 참조는 ref 속성을 사용하여 설정하는 것을 지난번 강좌에서 보았다. 두 경우 모두 하나의 값을 bean에 전달한다.


그러면 List, Set, Map, Properties같은 java collection(즉, 다수의 값을 갖는)을 전달하는 방법은 무엇일까? 이러한 상황을 다루기 위해 Spring은 아래와 같은 네가지 collection 타입 설정요소를 제공한다.

ElementDescription
<list>

중복을 허락하는 list의 값

<set>

중복을 허락하지 않는 set의 값

<map>

모든 타입을 사용할 수 있는 name-value쌍의 collection값

<props>

String 타입의 name-value쌍의 collection값

java.util.Collection 또는 array의 구현을 연결(wire)하기 위해 <list> 또는 <set>을 사용할 수 있다.


collection 삽입시 아래 두가지 경우가 있을 수 있다. 

(a) collection의 값을 직접 전달

(b) collection 요소의 하나로서 bean의 참조를 전달


Example:

[003] HelloWorld Example을 참조하여 프로젝트를 생성한다.
이번 예제는 (a) collection값을 직접 전달하는 경우의 예이다.

JavaCollection.java:

package com.tutorialspoint;
import java.util.*;

public class JavaCollection {
   List addressList;
   Set  addressSet;
   Map  addressMap;
   Properties addressProp;

   // a setter method to set List
   public void setAddressList(List addressList) {
      this.addressList = addressList;
   }
   
   // prints and returns all the elements of the list.
   public List getAddressList() {
      System.out.println("List Elements :"  + addressList);
      return addressList;
   }

   // a setter method to set Set
   public void setAddressSet(Set addressSet) {
      this.addressSet = addressSet;
   }

   // prints and returns all the elements of the Set.
   public Set getAddressSet() {
      System.out.println("Set Elements :"  + addressSet);
      return addressSet;
   }

   // a setter method to set Map
   public void setAddressMap(Map addressMap) {
      this.addressMap = addressMap;
   }
   
   // prints and returns all the elements of the Map.
   public Map getAddressMap() {
      System.out.println("Map Elements :"  + addressMap);
      return addressMap;
   }

   // a setter method to set Property
   public void setAddressProp(Properties addressProp) {
      this.addressProp = addressProp;
   }
   
   // prints and returns all the elements of the Property.
   public Properties getAddressProp() {
      System.out.println("Property Elements :"  + addressProp);
      return addressProp;
   }
}

MainApp.java:

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
             new ClassPathXmlApplicationContext("Beans.xml");

      JavaCollection jc=(JavaCollection)context.getBean("javaCollection");

      jc.getAddressList();
      jc.getAddressSet();
      jc.getAddressMap();
      jc.getAddressProp();
   }
}

Beans.xml:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <!-- Definition for javaCollection -->
   <bean id="javaCollection" class="com.tutorialspoint.JavaCollection">

      <!-- results in a setAddressList(java.util.List) call -->
      <property name="addressList">
         <list>
            <value>INDIA</value>
            <value>Pakistan</value>
            <value>USA</value>
            <value>USA</value>
         </list>
      </property>

      <!-- results in a setAddressSet(java.util.Set) call -->
      <property name="addressSet">
         <set>
            <value>INDIA</value>
            <value>Pakistan</value>
            <value>USA</value>
            <value>USA</value>
        </set>
      </property>

      <!-- results in a setAddressMap(java.util.Map) call -->
      <property name="addressMap">
         <map>
            <entry key="1" value="INDIA"/>
            <entry key="2" value="Pakistan"/>
            <entry key="3" value="USA"/>
            <entry key="4" value="USA"/>
         </map>
      </property>
      
      <!-- results in a setAddressProp(java.util.Properties) call -->
      <property name="addressProp">
         <props>
            <prop key="one">INDIA</prop>
            <prop key="two">Pakistan</prop>
            <prop key="three">USA</prop>
            <prop key="four">USA</prop>
         </props>
      </property>

   </bean>

</beans>

실행 결과는 아래와 같다. Beans.xml에서 정의한 값들이 출력되고 있음을 알 수 있다. 

List Elements :[INDIA, Pakistan, USA, USA]
Set Elements :[INDIA, Pakistan, USA]
ap Elements :{1=INDIA, 2=Pakistan, 3=USA, 4=USA}
Property Elements :{two=Pakistan, one=INDIA, three=USA, four=USA}

Injecting Bean References:

아래 bean 정의는 collection 요소의 하나로서 bean 참조가 삽입되는 것을 이해하기 위한 것이다. 다음 예제는 value와 참조를 함께 혼합한 것이다.
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <!-- Bean Definition to handle references and values -->
   <bean id="..." class="...">

      <!-- Passing bean reference  for java.util.List -->
      <property name="addressList">
         <list>
            <ref bean="address1"/>
            <ref bean="address2"/>
            <value>Pakistan</value>
         </list>
      </property>
      
      <!-- Passing bean reference  for java.util.Set -->
      <property name="addressSet">
         <set>
            <ref bean="address1"/>
            <ref bean="address2"/>
            <value>Pakistan</value>
         </set>
      </property>
      
      <!-- Passing bean reference  for java.util.Map -->
      <property name="addressMap">
         <map>
            <entry key="one" value="INDIA"/>
            <entry key ="two" value-ref="address1"/>
            <entry key ="three" value-ref="address2"/>
         </map>
      </property>
      
   </bean>

</beans>
위의  bean 정의를 사용하려면 참조를 이용할 수 있도록 setter 함수를 정의해야 한다. (이말은 value와 다르게 참조의 경우 일반적으로 객체명.함수()의 형태를 이용해 원하는 결과를 가지고 오기 때문에 그에 적합하도록 고쳐야 한다는 뜻으로 보여진다.)

Injecting null and empty string values

Value로써 empty string을 전달하려면 아래와 같이 할 수 있다.
<bean id="..." class="exampleBean">
   <property name="email" value=""/>
</bean>
이는 exampleBean.setEmail("") 과 동일하다.

NULL값을 전달하려면 아래와 같이 할 수 있다.
<bean id="..." class="exampleBean">
   <property name="email"><null/></property>
</bean>
이는 exampleBean.setEmail(null) 과 동일하다.







반응형

+ Recent posts