[Spring] ์คํ๋ง XML ์ค์ ํ์ผ ์์ฑ ๋ฐฉ๋ฒ ์ ๋ฆฌ
๐ ๋ชฉ์ฐจ
1. ์คํ๋ง XML ์ค์ ํ์ผ ํฌ๋งท
- ๊ธฐ๋ณธ ํฌ๋งท
- ์ ๋ ธํ ์ด์ ์ค์ ์ ์ฌ์ฉํ๊ธฐ ์ํ ํฌ๋งท
2. ๋น(Bean) ์ค์ ์์
- ์๋ ์ฃผ์ ์ค์ - autowire ์์ฑ
3. DI(Dependency Injection) ์ค์
- ์์ฑ์ ์ฃผ์
- ํ๋กํผํฐ ์ฃผ์
- ํ๋กํผํฐ ์ฃผ์ - List ํ์
- ํ๋กํผํฐ ์ฃผ์ - Set ํ์
- ํ๋กํผํฐ ์ฃผ์ - Map ํ์
- ํ๋กํผํฐ ์ฃผ์ - Properties ํ์
4. ApplicationContext ๊ฐ์ฒด ์์ฑ
- ์คํ๋ง XML ์ค์ ํ์ผ์ด ํ ๊ฐ์ธ ๊ฒฝ์ฐ
- ์คํ๋ง XML ์ค์ ํ์ผ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ
- ์คํ๋ง XML ์ค์ ํ์ผ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ(import ํ๊ทธ ์ฌ์ฉ)
1. ์คํ๋ง XML ์ค์ ํ์ผ ํฌ๋งท
๊ธฐ๋ณธ ํฌ๋งท
๐ ๋น ๋ฑ๋ก, ๋น ์ค์ ์ ๋ชจ๋ 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">
</beans>
์์ ๊ฐ์ ๋ค์ ์คํ์ด์ค์ ์คํค๋ง ์์ฑ์ ๊ฐ๋ <beans> ํ๊ทธ ์์ ์คํ๋ง ๋น ์ค์ ์ ์์ฑํ๋ค.
์ ๋ ธํ ์ด์ ์ค์ ์ ์ฌ์ฉํ๊ธฐ ์ํ ํฌ๋งท
๐ ๋น ๋ฑ๋ก์ XML, ๋น ์ค์ ์ ์๋ฐ ์ ๋ ธํ ์ด์ ์ผ๋ก ํ ๊ฒฝ์ฐ ์ด ํฌ๋งท์ ์ฌ์ฉํ๋ค.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
context ๋ค์ ์คํ์ด์ค์ <context:annotation-config/> ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ฉด ๋น ์ค์ ์ XML ํ์ผ์ด ์๋ ๋น ํด๋์ค์ ์ ๋
ธํ
์ด์
์ ๊ฒ์ํด ๋ฐ์ํ๋ค.
2. ๋น(Bean) ์ค์ ์์
<bean> ํ๊ทธ๋ฅผ ์ด์ฉํด ๋น์ ์ ์ํ๋ค.
<bean id="studentDao" class="ems.member.dao.StudentDao" />
<bean> ํ๊ทธ์ ํ์ ์์ฑ์ class ์์ฑ ํ๋ ๋ฟ์ด๋ค.
id๋ ๋น์ id๋ฅผ ํตํด ์ฐธ์กฐํ ๊ฒฝ์ฐ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์ค์ ํ๋ฉด ๋๋ค.
์๋ฐ ์ฝ๋์์ getBean()์ผ๋ก ๋น์ ๊ฐ์ ธ์ค๋์ง, ์ฃผ์ ์ค์ ์์ ref ์์ฑ์ผ๋ก ๋น์ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ์ด๋ค.
id, class ์ธ์๋ lazy-init, scope, primary, init-method, destroy-method ์์ฑ์ด ์๋ค.
- id : ๋น ์ด๋ฆ(id) ์ค์
- class : ๋น ํ์ ์ค์
- scope : ๋น์ scope ์ค์ . singleton/prototype
- primary : true๋ฅผ ์ง์ ํ์ฌ ๊ฐ์ ํ์ ์ ๋น์ด ์ฌ๋ฌ๊ฐ ์ผ๋ ์ฐ์ ์ ์ผ๋ก ์ฌ์ฉํ ๋น ์ค์
- lazy-init : true๋ฅผ ์ง์ ํ์ฌ ๋น์ ์ฌ์ฉํ ๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋๋ก ์ค์
- init-method : ๋น ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ ํธ์ถํ ๋ฉ์๋ ์ค์
- destroy-method : ๋น ๊ฐ์ฒด๊ฐ ์๋ฉธ๋ ๋ ํธ์ถํ ๋ฉ์๋ ์ค์
์๋ ์ฃผ์ ์ค์ - autowire ์์ฑ
ํด๋์ค์ ์ฐธ์กฐ ํ์ ํ๋์ ํํด์ autowire ์์ฑ์ ์ฌ์ฉํด ์๋ ์ฃผ์ ๋๋๋ก ์ค์ ํ ์ ์๋ค.
XML ์ค์ ํ์ผ
<bean id='obj2' class='com.atoz_develop.beans.TestBean1' autowire="byName"/>
<bean id='data1' class='com.atoz_develop.beans.DataBean1'/>
<bean id='data2' class='com.atoz_develop.beans.DataBean1'/>
<bean>์ autowire ์์ฑ์ "byName"์ ์ค์ ํ๋ค.
์๋ฐ ์ฝ๋
public class TestBean1 {
private DataBean1 data1;
private DataBean1 data2;
public DataBean1 getData1() {
return data1;
}
public void setData1(DataBean1 data1) {
this.data1 = data1;
}
public DataBean1 getData2() {
return data2;
}
public void setData2(DataBean1 data2) {
this.data2 = data2;
}
}
TestBean1 ํด๋์ค์ ๋น์ ์์ฑํ ๋ DataBean1 ํ์ ์ธ ํ๋ data1, data2์ ๋ณ์๋ช ๊ณผ id๊ฐ ๋์ผํ ๋น์ด ์๋์ผ๋ก ์ฃผ์ ๋๋ค.
๋ฐ๋ผ์ <bean>์ id ์์ฑ๊ณผ ํด๋์ค์ ๋ณ์๋ช ์ด ๋์ผํด์ผ ํ๋ฉฐ, setter๋ฅผ ํตํด ์ฃผ์ ๋๋ฏ๋ก setter๊ฐ ํ์ํ๋ค.
๋ค์์ผ๋ก ๋น์ ์ด๋ฆ(id)๊ฐ ์๋ ๋น์ ํ์ ์ ํตํ ์๋ ์ฃผ์ ์ ์์๋ณด์.
XML ์ค์ ํ์ผ
<bean id='obj3' class='com.atoz_develop.beans.TestBean2' autowire="byType"/>
<bean id='data_bean2' class='com.atoz_develop.beans.DataBean2'/>
<bean>์ autowire ์์ฑ์ "byType"์ ์ค์ ํ๋ค.
์๋ฐ ์ฝ๋
public class TestBean2 {
private DataBean2 data1;
private DataBean2 data2;
public DataBean2 getData1() {
return data1;
}
public void setData1(DataBean2 data1) {
this.data1 = data1;
}
public DataBean2 getData2() {
return data2;
}
public void setData2(DataBean2 data2) {
this.data2 = data2;
}
}
TestBean2 ํด๋์ค์ ๋น์ ์์ฑํ ๋ DataBean2 ํ์ ์ธ ํ๋ data1, data2์ ํ์ ์ด ๊ฐ์ ๋น์ด ์๋์ผ๋ก ์ฃผ์ ๋๋ค.
XML ์ค์ ์ primary ์ค์ ์์ด ํ์ ์ด ๋์ผํ ๋น์ด ๋ ๊ฐ ์ด์ ์ ์๋์ด ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ฏ๋ก ์ด์ ์ฃผ์ํ์.
๋ง์ฐฌ๊ฐ์ง๋ก setter๋ฅผ ํตํด ์ฃผ์ ๋๋ฏ๋ก setter๊ฐ ํ์ํ๋ค.
์์ฑ์๋ฅผ ํตํ ์๋ ์ฃผ์ ์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ๋ค.
XML ์ค์ ํ์ผ
<bean id='data_bean2' class='com.atoz_develop.beans.DataBean2'/>
<bean id='obj5' class='com.atoz_develop.beans.TestBean3' autowire="constructor"/>
<bean>์ autowire ์์ฑ์ "constructor"๋ฅผ ์ค์ ํ๋ค.
์๋ฐ ์ฝ๋
public class TestBean3 {
private int data1;
private String data2;
private DataBean2 data3;
private DataBean2 data4;
public TestBean3(DataBean2 data3, DataBean2 data4) {
this.data3 = data3;
this.data4 = data4;
}
public int getData1() {
return data1;
}
public void setData1(int data1) {
this.data1 = data1;
}
public String getData2() {
return data2;
}
public void setData2(String data2) {
this.data2 = data2;
}
public DataBean2 getData3() {
return data3;
}
public void setData3(DataBean2 data3) {
this.data3 = data3;
}
public DataBean2 getData4() {
return data4;
}
public void setData4(DataBean2 data4) {
this.data4 = data4;
}
}
autowire ์์ฑ์ ์ด์ฉํ ์๋ ์ฃผ์ ์ ์ฐธ์กฐ ํ์ ๋ง ๊ฐ๋ฅํ๋ฏ๋ก ๊ธฐ๋ณธ ํ์ ํ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ง์ ์ค์ ํด์ฃผ์ด์ผ ํ๋ค.
XML ์ค์ ํ์ผ
<bean id='obj7' class='com.atoz_develop.beans.TestBean3' autowire="constructor">
<constructor-arg value='200' index='0' type='int'/>
<constructor-arg value='๋ฌธ์์ด2' index='1'/>
</bean>
์๋ฐ ์ฝ๋
public class TestBean3 {
private int data1;
private String data2;
private DataBean2 data3;
private DataBean2 data4;
public TestBean3(int data1, String data2, DataBean2 data3, DataBean2 data4) {
this.data1 = data1;
this.data2 = data2;
this.data3 = data3;
this.data4 = data4;
}
public int getData1() {
return data1;
}
public void setData1(int data1) {
this.data1 = data1;
}
public String getData2() {
return data2;
}
public void setData2(String data2) {
this.data2 = data2;
}
public DataBean2 getData3() {
return data3;
}
public void setData3(DataBean2 data3) {
this.data3 = data3;
}
public DataBean2 getData4() {
return data4;
}
public void setData4(DataBean2 data4) {
this.data4 = data4;
}
}
<beans> ๋ ๋ฒจ์ default-autowire ์์ฑ์ ์ฌ์ฉํด์ <bean>์ autowire ์ค์ ์ด ๋์ด์์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฉํ ์๋ ์ฃผ์ ๋ฐฉ๋ฒ์ ์ค์ ํ ์ ์๋ค.
<?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"
default-autowire="byName">
์ด๋ ๊ฒ <beans>์ default-autowire ์์ฑ์ ์ถ๊ฐํ๊ณ ์ฌ์ฉํ ์๋ ์ฃผ์ ์ต์ ์ ์ค์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ํน์ ๋น์ ์๋ ์ฃผ์ ์ ํ์ง ์์ผ๋ ค๋ฉด <bean>์ autowire ์์ฑ์ "no"๋ฅผ ์ค์ ํ๋ฉด ๋๋ค.
<bean id='obj9' class='com.atoz_develop.beans.TestBean1' autowire="no"/>
์ด ๋น์ default-autowire์ ์ํฅ์ ๋ฐ์ง ์๊ฒ ๋๋ค.
3. DI(Dependency Injection) ์ค์
์์ฑ์ ์ฃผ์
XML ์ค์ ํ์ผ
<bean id="studentDao" class="ems.member.dao.StudentDao" ></bean>
<bean id="registerService" class="ems.member.service.StudentRegisterService">
<constructor-arg ref="studentDao" />
</bean>
์๋ฐ ์ฝ๋
public class StudentRegisterService {
private StudentDao studentDao;
public StudentRegisterService(StudentDao studentDao) {
this.studentDao = studentDao;
}
}
์์ฑ์๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ <constructor-arg>์ type ์์ฑ์ ์ฌ์ฉํด์ ์ด๋ค ์์ฑ์๋ฅผ ์ฌ์ฉํด์ ๋น ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๊ฒ์ธ์ง ๊ตฌ์ฒด์ ์ผ๋ก ๋ช ์ํ ์ ์๋ค.
์ง์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก String ํ์ ์ ์๊ท๋จผํธ๋ฅผ ๊ฐ๋ ์์ฑ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฏ๋ก ๊ทธ ์ธ์ ๊ธฐ๋ณธ ํ์ ์ ๊ฐ๋ ์์ฑ์ ์ฃผ์ ์ type์ ๋ช ์ํ๋ ๊ฒ์ด ์ข๋ค.
XML ์ค์ ํ์ผ
<bean id="obj1" class="com.atoz_develop.beans.TestBean">
<constructor-arg value="100" type="int"/>
</bean>
<bean id="obj2" class="com.atoz_develop.beans.TestBean">
<constructor-arg value="11.11" type="double"/>
</bean>
<bean id="obj3" class="com.atoz_develop.beans.TestBean">
<constructor-arg value="๋ฌธ์์ด" type="java.lang.String"/>
</bean>
์๋ฐ ์ฝ๋
public class TestBean {
private int data1;
private double data2;
private String data3;
public TestBean(int data1) {
this.data1 = data1;
this.data2 = 0.0;
this.data3 = null;
}
public TestBean(double data2) {
this.data1 = 0;
this.data2 = data2;
this.data3 = null;
}
public TestBean(String data3) {
this.data1 = 0;
this.data2 = 0.0;
this.data3 = data3;
}
}
์๋ฐ์ new ์ฐ์ฐ์๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋์ ๋ฌ๋ฆฌ ์คํ๋ง DI์ ์์ฑ์ ์ฃผ์ ์ค์ ์์๋ ์์ฑ์ ์๊ท๋จผํธ์ ์์๋ฅผ ๋ค๋ฅด๊ฒ ํ ์ ์๋ค.
์คํ๋ง์ด ์์๋ฅผ ์ ์ถํ๊ธฐ ์ด๋ ค์ธ ๋๋ type๊ณผ index ์์ฑ์ ์ฌ์ฉํด์ ์์๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ๋ช ์ํ๋ค.
XML ์ค์ ํ์ผ
<bean id="obj1" class="com.atoz_develop.beans.TestBean">
<constructor-arg value="๋ฐ๊ฐ์ต๋๋ค" type="java.lang.String"/>
<constructor-arg value="300" type="int"/>
<constructor-arg value="33.33" type="double"/>
</bean>
<bean id="obj2" class="com.atoz_develop.beans.TestBean">
<constructor-arg value="44.44" type="double" index="1"/>
<constructor-arg value="44" type="int" index="0"/>
<constructor-arg value="์๋
ํ์ธ์" type="java.lang.String" index="2"/>
</bean>
์๋ฐ ์ฝ๋
public class TestBean {
private int data1;
private double data2;
private String data3;
public TestBean(int data1, double data2, String data3) {
this.data1 = data1;
this.data2 = data2;
this.data3 = data3;
}
}
๊ฐ์ฒด ์ฃผ์ ์ <constructor-arg>์ ref ์์ฑ์ ์ฌ์ฉํ๋ ๊ฒ ์ธ์๋ <constructor-arg> ํ์์ <bean>์ ์ฌ์ฉํด์ ๋น์ ์ง์ ์ ์ํ ์ ์๋ค.
XML ์ค์ ํ์ผ
<bean id="obj" class="com.atoz_develop.beans.TestBean">
<constructor-arg>
<bean class="com.atoz_develop.beans.DataBean"/>
</constructor-arg>
<constructor-arg>
<bean class="com.atoz_develop.beans.DataBean"/>
</constructor-arg>
</bean>
์๋ฐ ์ฝ๋
public class TestBean {
private DataBean data1;
private DataBean data2;
public TestBean(DataBean data1, DataBean data2) {
this.data1 = data1;
this.data2 = data2;
}
}
ํ๋กํผํฐ ์ฃผ์
XML ์ค์ ํ์ผ
<bean id="dataBaseConnectionInfoDev" class="ems.member.DataBaseConnectionInfo">
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="userId" value="scott" />
<property name="userPw" value="tiger" />
</bean>
<property>์ value ์์ฑ์ ์ฌ์ฉํด์ ๊ฐ์ ์ค์ ํ๋ค.
์๋ฐ ์ฝ๋
public class DataBaseConnectionInfo {
private String jdbcUrl;
private String userId;
private String userPw;
public String getJdbcUrl() {
return jdbcUrl;
}
public void setJdbcUrl(String jdbcUrl) {
this.jdbcUrl = jdbcUrl;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserPw() {
return userPw;
}
public void setUserPw(String userPw) {
this.userPw = userPw;
}
}
XML ์ค์ ํ์ผ
<bean id="informationService" class="ems.member.service.EMSInformationService">
<property name="info">
<value>Education Management System program was developed in 2015.</value>
</property>
</bean>
value ๊ฐ์ด ๊ธธ ๊ฒฝ์ฐ <property>์ ํ์์ <value> ํ๊ทธ๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ์ค์ ํ ์๋ ์๋ค.
์๋ฐ ์ฝ๋
public class EMSInformationService {
private String info;
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
ํ๋กํผํฐ๋ฅผ ํตํ ๊ฐ์ฒด ์ฃผ์ ์ ์์ฑ์ ์ฃผ์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก <property> ํ์์ ๋น์ ์ง์ ์ ์ํ๊ฑฐ๋ ref ์์ฑ์ ์ฌ์ฉํด์ ์ค์ ํ ์ ์๋ค.
XML ์ค์ ํ์ผ
<bean id="testBean" class="com.atoz_develop.beans.TestBean">
<property name="data1">
<bean class="com.atoz_develop.beans.DataBean"/>
</property>
<property name="data2" ref="data_bean"/>
</bean>
<bean id="dataBean" class="com.atoz_develop.beans.DataBean"/>
์๋ฐ ์ฝ๋
public class TestBean {
private DataBean data1;
private DataBean data2;
public DataBean getData1() {
return data1;
}
public void setData1(DataBean data1) {
this.data1 = data1;
}
public DataBean getData2() {
return data2;
}
public void setData2(DataBean data2) {
this.data2 = data2;
}
}
ํ๋กํผํฐ ์ฃผ์ - List ํ์
XML ์ค์ ํ์ผ
<bean id="informationService" class="ems.member.service.EMSInformationService">
<property name="developers">
<list>
<value>Cheney.</value>
<value>Eloy.</value>
<value>Jasper.</value>
<value>Dillon.</value>
<value>Kian.</value>
</list>
</property>
</bean>
List ํ์ ์ <property>.<list> ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ค.
์๋ฐ ์ฝ๋
public class EMSInformationService {
private List<String> developers;
public List<String> getDevelopers() {
return developers;
}
public void setDevelopers(List<String> developers) {
this.developers = developers;
}
}
์ถ๊ฐ๋ก <value>์๋ type ์์ฑ์ ์ฌ์ฉํด์ ํ์ ์ ์ง์ ํ ์ ์๋ค.
<property name="list2">
<list>
<value type='int'>100</value>
<value type='int'>200</value>
<value type='int'>300</value>
</list>
</property>
value๊ฐ ๋ฌธ์์ด์ด ์๋๋ผ๋ฉด type ์์ฑ์ผ๋ก ํ์ ์ ์ง์ ํด ์ฃผ๋ ๊ฒ์ด ์ข๋ค.
์ ๋ค๋ฆญ์ด Class์ธ List์ ์ฃผ์ ์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ๋ค.
XML ์ค์ ํ์ผ
<bean id='dataBean' class='com.atoz_develop.beans.DataBean' scope='prototype'/>
<bean id='t1' class='com.atoz_develop.beans.TestBean'>
<property name="list3">
<list>
<bean class='com.atoz_develop.beans.DataBean'/>
<bean class='com.atoz_develop.beans.DataBean'/>
<ref bean='dataBean'/>
<ref bean='dataBean'/>
</list>
</property>
</bean>
<bean> ํ๊ทธ๋ก ๋น์ ์ง์ ์ค์ ํ๋์ง, <ref>๋ฅผ ์ฌ์ฉํด์ ๊ธฐ์กด์ ์ค์ ๋ ๋น์ ์ฐธ์กฐํ๋๋ก ํ ์ ์๋ค.
์๋ฐ ์ฝ๋
public class TestBean {
private List<DataBean> list3;
public List<DataBean> getList3() {
return list3;
}
public void setList3(List<DataBean> list3) {
this.list3 = list3;
}
}
ํ๋กํผํฐ ์ฃผ์ - Set ํ์
XML ์ค์ ํ์ผ
<bean id='dataBean' class='com.atoz_develop.beans.DataBean' scope='prototype'/>
<bean id='t1' class='com.atoz_develop.beans.TestBean'>
<!-- ์ ๋ค๋ฆญ์ด String์ธ set -->
<property name="set1">
<set>
<value>๋ฌธ์์ด1</value>
<value>๋ฌธ์์ด2</value>
<value>๋ฌธ์์ด3</value>
<value>๋ฌธ์์ด3</value> <!-- Set์ ํน์ฑ์ ์ฃผ์
๋์ง ์์ -->
<value>๋ฌธ์์ด3</value> <!-- Set์ ํน์ฑ์ ์ฃผ์
๋์ง ์์ -->
</set>
</property>
<!-- ์ ๋ค๋ฆญ์ด Integer์ธ set -->
<property name="set2">
<set>
<value type='int'>100</value>
<value type='int'>200</value>
<value type='int'>300</value>
<value type='int'>300</value> <!-- Set์ ํน์ฑ์ ์ฃผ์
๋์ง ์์ -->
<value type='int'>300</value> <!-- Set์ ํน์ฑ์ ์ฃผ์
๋์ง ์์ -->
</set>
</property>
<!-- ์ ๋ค๋ฆญ์ด DataBean์ธ set -->
<property name="set3">
<set>
<bean class='com.atoz_develop.beans.DataBean'/>
<bean class='com.atoz_develop.beans.DataBean'/>
<ref bean="dataBean"/>
<ref bean="dataBean"/> <!-- Set์ ํน์ฑ์ ์ฃผ์
๋์ง ์์ -->
<ref bean="dataBean"/> <!-- Set์ ํน์ฑ์ ์ฃผ์
๋์ง ์์ -->
<ref bean="dataBean"/> <!-- Set์ ํน์ฑ์ ์ฃผ์
๋์ง ์์ -->
</set>
</property>
</bean>
XML๋ก ์ฃผ์ ์ค์ ์ ํ ๋ Set ํ์ ์ ํน์ฑ์ ์ค๋ณต๋ ๊ฐ์ ๋ฃ์ ์ ์๊ธฐ ๋๋ฌธ์ <value>์ ๊ฐ์ด ๊ฐ๊ฑฐ๋ <ref>์ bean id๊ฐ ๋์ผํ ๊ฒฝ์ฐ ์ฃผ์ ๋์ง ์๋๋ค.
ํนํ, <bean>์ scope ์์ฑ์ด prototype์ธ ๋น์ <ref>๋ก ์ค์ ํด๋ ์ฃผ์ ๋์ง ์๋๋ค๋ ํน์ง์ด ์๊ธฐ ๋๋ฌธ์ Set ํ์ ์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํด์ผ ํ ๋๋ <bean> ํ๊ทธ๋ก ์ง์ ์ฃผ์ ํ๋๋ก ์ค์ ํด์ผ ํ๋ค.
์๋ฐ ์ฝ๋
public class TestBean {
private Set<String> set1;
private Set<Integer> set2;
private Set<DataBean> set3;
public Set<String> getSet1() {
return set1;
}
public void setSet1(Set<String> set1) {
this.set1 = set1;
}
public Set<Integer> getSet2() {
return set2;
}
public void setSet2(Set<Integer> set2) {
this.set2 = set2;
}
public Set<DataBean> getSet3() {
return set3;
}
public void setSet3(Set<DataBean> set3) {
this.set3 = set3;
}
}
ํ๋กํผํฐ ์ฃผ์ - Map ํ์
XML ์ค์ ํ์ผ
<bean id="informationService" class="ems.member.service.EMSInformationService">
<property name="administrators">
<map>
<entry>
<key>
<value>Cheney</value>
</key>
<value>cheney@springPjt.org</value>
</entry>
<entry>
<key>
<value>Jasper</value>
</key>
<value>jasper@springPjt.org</value>
</entry>
</map>
</property>
</bean>
Map ํ์ ์ <property>.<map>.<entry>๋ฅผ ์ฌ์ฉํ๋ค.
์๋ฐ ์ฝ๋
public class EMSInformationService {
private Map<String, String> administrators;
public Map<String, String> getAdministrators() {
return administrators;
}
public void setAdministrators(Map<String, String> administrators) {
this.administrators = administrators;
}
}
๋ค์์ ์ ๋ค๋ฆญ ํ์ ์ด <String, Object> ์ธ Map์ ์ฃผ์ ์ค์ ์์ด๋ค.
XML ์ค์ ํ์ผ
<bean id='dataBean' class='com.atoz_develop.beans.DataBean' scope='prototype'/>
<!-- map -->
<bean id='t1' class='com.atoz_develop.beans.TestBean'>
<property name="map1">
<map>
<entry key="a1" value='๋ฌธ์์ด'/>
<entry key='a2' value='100' value-type='int'/>
<entry key='a3'>
<bean class='com.atoz_develop.beans.DataBean'/>
</entry>
<entry key='a4' value-ref="dataBean"/>
<entry key='a5'>
<list>
<value>๋ฌธ์์ด1</value>
<value>๋ฌธ์์ด2</value>
<value>๋ฌธ์์ด3</value>
</list>
</entry>
</map>
</property>
</bean>
<entry>์ key, value ์์ฑ์ผ๋ก ํ ์ค์ ์ค์ ํ ์๋ ์๋ค.
type์ ์ง์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฌธ์์ด๋ก ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ value-type ์์ฑ์ ์ฌ์ฉํด์ ํ์ ์ ์ง์ ํด ์ฃผ์ด์ผ ํ๋ค.
์ ์ค์ ์ "a1"์๋ ๋ฌธ์์ด์, "a2"์๋ ์ ์๋ฅผ, "a3", "a4"์๋ DataBean ํ์ ์ ๊ฐ์ฒด๋ฅผ ์๋ก ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก, "a5"์๋ List ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ๋ ์ค์ ์ด๋ค.
์๋ฐ ์ฝ๋
public class TestBean {
private Map<String, Object> map1;
public Map<String, Object> getMap1() {
return map1;
}
public void setMap1(Map<String, Object> map1) {
this.map1 = map1;
}
}
ํ๋กํผํฐ ์ฃผ์ - Properties ํ์
XML ์ค์ ํ์ผ
<bean id='t1' class='com.atoz_develop.beans.TestBean'>
<!-- property -->
<property name="prop1">
<props>
<prop key="p1">๋ฌธ์์ด1</prop>
<prop key="p2">๋ฌธ์์ด2</prop>
<prop key="p3">๋ฌธ์์ด3</prop>
</props>
</property>
</bean>
์๋ฐ ์ฝ๋
public class TestBean {
private Properties prop1;
public Properties getProp1() {
return prop1;
}
public void setProp1(Properties prop1) {
this.prop1 = prop1;
}
}
4. ApplicationContext ๊ฐ์ฒด ์์ฑ
์คํ๋ง XML ์ค์ ํ์ผ์ด ํ ๊ฐ์ธ ๊ฒฝ์ฐ
// GenericXmlApplicationContext ์ฌ์ฉ - 'classpath:' prefix ํ์
ApplicationContext context = new GenericXmlApplicationContext("classpath:applicationContext.xml");
// ClassPathXmlApplicationContext ์ฌ์ฉ
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
์คํ๋ง XML ์ค์ ํ์ผ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ
String[] appCtxs = {"classpath:appCtx1.xml", "classpath:appCtx2.xml", "classpath:appCtx3.xml"};
ApplicationContext context = new GenericXmlApplicationContext(appCtxs);
ApplicationContext context = new ClassPathXmlApplicationContext("appCtx1.xml", "appCtx2.xml", "appCtx3.xml");
์คํ๋ง XML ์ค์ ํ์ผ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ(import ํ๊ทธ ์ฌ์ฉ)
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">
<import resource="classpath:appCtx2.xml"/>
<import resource="classpath:appCtx3.xml"/>
</beans>
ApplicationContext ๊ฐ์ฒด ์์ฑ์ XML ์ค์ ํ์ผ์ด ํ ๊ฐ์ธ ๊ฒฝ์ฐ์ ๋์ผํ๋ค.
๋ด์ฉ ๋ฐ ์์ ์์ค ์ถ์ฒ
์ธํ๋ฐ - ์ค์ฌ์ฑ์ ์คํ๋ง ํ๋ ์์ํฌ ๊ฐ๋ฐ์๋ฅผ ์ํ ์ค์ต์ ํตํ ์ ๋ฌธ ๊ณผ์
๊ด๋ จ ๊ธ
- [Spring] ์คํ๋ง XML ์ค์ → ์ ๋ ธํ ์ด์ ์ค์ ๋ณํ ๋ฐฉ๋ฒ
๋๊ธ