웹 프로그래밍/Spring
[Spring] DI 실습(4) :Dependency 응용, 집합객체 설정 : list, map
산을넘는다
2020. 8. 14. 11:15
List
ListAddress.java
package di.collection;
import java.util.List;
public class ListAddress {
private List<String> address;
private List<Integer> numbers;
public ListAddress() {
}
public ListAddress(List<String> address) {
this.address = address;
}
public ListAddress(List<String> address, List<Integer> numbers) {
super();
this.address = address;
this.numbers = numbers;
}
public List<String> getAddress() {
return address;
}
public void setAddress(List<String> address) {
this.address = address;
}
}
ListMain.java
package di.collection;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class ListMain {
public static void main(String[] args) {
ApplicationContext container = new GenericXmlApplicationContext("di-collection01.xml");
ListAddress list = container.getBean("list", ListAddress.class); // 생성자
ListAddress list2 = container.getBean("list02", ListAddress.class); // property
ListAddress list3 = container.getBean("list03", ListAddress.class); // property
for(String addr : list.getAddress()) {
System.out.println(addr);
}
System.out.println("======================");
for(String addr : list2.getAddress()) {
System.out.println(addr);
}
System.out.println("======================");
for(String addr : list3.getAddress()) {
System.out.println(addr);
}
}
}
di-collection01.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.xsd " >
<!-- propery네. 즉 세터 주입이네. setAddress() 메소드가 호출되겠군. -->
<!-- 그런데, 상수값은 value 속성에 담아 보냈는데, list 객체에 add는 어떻게 할까? -->
<!-- 바로 <list></list> 태그 내에 value를 써서 보내면 된다. -->
<!-- 즉. list.add("서울시 서초구"); list.add("경기도~"); list.add("부산~"); -->
<bean class = "di.collection.ListAddress" id = "list">
<property name = "address">
<list>
<value>서울시 서초구</value>
<value>경기도 광명시 철산동</value>
<value>부산광역시 동구</value>
</list>
</property>
</bean>
<!-- constructor-arg네. 즉, 생성자 주입방식이네. -->
<!-- 이때도 list에 add 하려면 <list> 태그 내에 <value>에 값을 보내면 된다. -->
<bean class = "di.collection.ListAddress" id = "list02">
<constructor-arg>
<list value-type="java.lang.String">
<!-- <list> -->
<value>서울시 서초구</value>
<value>경기도 광명시 철산동</value>
<value>부산광역시 동구</value>
</list>
</constructor-arg>
</bean>
<!-- constructor-arg 태그가 2개 있네. 즉, 매개변수가 2개인 생성자로 객체를 만들겠네. -->
<!-- 그리고 List<String>, List<Integer> 두 개의 객체가 매개변수겠구나. -->
<!-- 각 리스트에 값을 담아 보내자. -->
<bean class="di.collection.ListAddress" id="list03">
<constructor-arg>
<list value-type="java.lang.String">
<value>10</value>
<value>20</value>
<value>30</value>
</list>
</constructor-arg>
<constructor-arg>
<list value-type="java.lang.Integer">
<value>100</value>
<value>200</value>
<value>300</value>
</list>
</constructor-arg>
</bean>
</beans>
Map
MapAddress.java
package di.collection;
import java.util.Map;
public class MapAddress {
private Map<String, String> address;
public MapAddress() {
}
public MapAddress(Map<String, String> address) {
super();
this.address = address;
}
public Map<String, String> getAddress() {
return address;
}
public void setAddress(Map<String, String> address) {
this.address = address;
}
}
MapMain.java
package di.collection;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class MapMain {
public static void main(String[] args) {
ApplicationContext context = new GenericXmlApplicationContext("di-collection02.xml");
//MapAddress 타입의 map 객체를 받아온다.
MapAddress map = context.getBean("map", MapAddress.class);
//map 객체 내에 Address라는 멤버변수가 있다. 이것은 map임.
//그러니 Map 타입으로 받아야 한다.
Map<String, String> addrs = map.getAddress();
// entrySet() 메소드는 key와 value가 모두 필요한 경우 사용하고
// keySet() 메소드는 key의 값만 필요할 때 사용한다.
Set<Entry<String, String>> address = addrs.entrySet();
for(Entry<String, String> a : address) {
System.out.println(a.getKey() + " : " + a.getValue());
}
}
}
di-collection02.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.xsd " >
<!-- property네. 세터 주입이다. setAddress() 메소드가 실행되겠다. -->
<!-- 값을 담은 map 객체를 어떻게 만들어서 세터에 값을 전달할까? -->
<!-- 바로 <map> 태그 내에 entry로 값을 담으면 된다. -->
<!-- 즉, entry 태그의 내용들이 map.put()의 인자가 되는 것이다. -->
<!-- 아래는 entry 태그가 3개이므로, put 과정이 세번 일어난 것이다. -->
<!-- 그런데, map은 key,value 쌍이므로 또 <key> <value>태그로 구분하여 담아야 함. -->
<!-- 구체적인 방법은 아래와 같다. -->
<bean class = "di.collection.MapAddress" id = "map">
<property name="address">
<map>
<entry>
<key><value>홍기리보이</value></key> <!-- value : 객체 외의 값을 쓸 때 -->
<value>서울시 서초구</value>
</entry>
<entry>
<key><value>강기리보이</value></key>
<value>서울시 강남구</value>
</entry>
<entry>
<key><value>조기리보이</value></key>
<value>경기도 분당구</value>
</entry>
</map>
</property>
</bean>
</beans>