목표
이전 시간에는 bean태그의 ref 속성을 이용하여 참조 형식의 속성에 값을 설정했었다.
이번엔 value 속성을 이용하여 값 형식의 속성에 값을 설정해보자.
또 생성자를 통한 DI 방법과 콜렉션 DI 방법에 대해 알아본다.
값 형식의 속성에 값 설정하기
public class NewlecExam implements Exam{
private int kor;
private int eng;
private int math;
private int com;
public NewlecExam() {
}
public NewlecExam(int kor, int eng, int math, int com) {
this.kor = kor;
this.eng = eng;
this.math = math;
this.com = com;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int getCom() {
return com;
}
public void setCom(int com) {
this.com = com;
}
@Override
public int total() {
int result = kor+eng+math+com;
return result;
}
@Override
public float avg() {
float result=total()/4.0f;
return result;
}
@Override
public String toString() {
return "NewlecExam [kor="+kor+", eng=" +eng+", math="+math+", com="+com+"]";
}
}
위와 같이 NewLecExam 클래스를 정의했을 때, xml에서 값 형식의 각 필드(kor, math 등) 값을 DI 해보겠다.
<!-- setting.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
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="exam" class="spring.di.entity.NewLecExam"/>
<property name="kor">
<value>10</value>
</property>
<property name="eng" value="10"/>
<property name="math" value="10"/>
<property name="com" value="10"/>
<bean id="console" class="spring.di.ui.GridExamConsole">
<property name="exam" ref="exam"/>
</bean>
<beans>
이전 참조 형식의 속성에 값을 DI해주었던 것 처럼, 똑같이 property 태그를 사용한다.
차이가 있다면 참조 형식에서는 ref 속성을 사용했고, 값 형식에서는 value 속성을 사용한다는 것이다.
생성자를 이용한 Dependency 객체 생성과 초기화
<!-- setting.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
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="exam" class="spring.di.entity.NewLecExam"/>
<constructor-arg name="kor" type="float" value="10"/>
<constructor-arg index="1" type="float" value="20"/>
<constructor-arg index="3" type="float" value="30"/>
<constructor-arg index="2" type="float" value="40"/>
<bean id="console" class="spring.di.ui.GridExamConsole">
<property name="exam" ref="exam"/>
</bean>
<beans>
constuctor-arg 태그를 이용하여 매개변수가 있는 생성자에 값을 주입시켜줄 수 있다.
위에선느 어떤 필드에 값을 주입해줄 것인지 명시하기 위해 name, index 속성을 사용했지만,
이를 생략했을 경우 생성자 매개변수에 차례로 값이 들어간다.
type은 주입하는 값의 타입을 명시해주고 싶을 때 사용하는 것으로, 이 예시에서는 필요없으나 정보 전달을 위해 써보았다.
p 네임스페이스를 사용한 생성자 DI
<!-- setting.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"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="exam" class="spring.di.entity.NewLecExam" p:kor="10" p:eng="20" p:math="30" p:com="40"/>
<bean id="console" class="spring.di.ui.GridExamConsole">
<property name="exam" ref="exam"/>
</bean>
<beans>
constructor-arg 태그를 사용하지 않고도 위처럼 p 네임스페이스를 이용하여 생성자의 매개변수를 DI 해줄 수 있다.
콜렉션 생성과 DI
public class Program {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring/di/setting.xml");
List<Exam> exams = new ArrayList<>();
exams.add(new NewlecExam(1,1,1,1));
for(Exam e : exams)
System.out.println(e);
}
}
출력결과 : NewlecExam [kor="1 eng=1, math=1, com=1]
위와 같은 콜렉션 객체를 xml에서 DI를 통해 생성해보자
<!-- setting.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"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="exam" class="spring.di.entity.NewLecExam" p:kor="10" p:eng="20" p:math="30" p:com="40"/>
<bean id="console" class="spring.di.ui.GridExamConsole">
<property name="exam" ref="exam"/>
</bean>
<bean id="exams" class="java.util.ArrayList">
<constructor-arg>
<list>
<bean class="spring.di.entity.NewlecExam" p:kor="20" p:eng="30"/>
<ref bean="exam"/>
</list>
</constructor-arg>
</bean>
<beans>
public class Program {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring/di/setting.xml");
List<Exam> exams = (List<Exam>) context.getBean("exams");
for(Exam e : exams)
System.out.println(e);
}
}
출력결과 : NewlecExam [kor=20 eng=30, math=0, com=0]
NewlecExam [kor=10 eng=20, math=30, com=40]
List는 생성자 형식으로 내부에 값을 add해줄 수 있다.
따라서 constructor-arg 태그를 사용하면 위처럼 list 객체들을 주입시켜줄 수 있다.
새로운 Dependency를 bean 태그를 사용하여 만들어 주입할 수도 있고, 기존에 만들어놨던 Dependency를
ref 태그를 통해 주입시켜줄 수도 있다.
util 네임스페이스를 사용한 콜렉션 DI
<!-- setting.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"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="exam" class="spring.di.entity.NewLecExam" p:kor="10" p:eng="20" p:math="30" p:com="40"/>
<bean id="console" class="spring.di.ui.GridExamConsole">
<property name="exam" ref="exam"/>
</bean>
<util:list id="exams" list-class="java.util.ArrayList">
<bean class="spring.di.entity.NewlecExam" p:kor="1" p:eng="3"/>
<ref bean="exam"/>
</util:list>
<beans>
bean 태그 대신 util:list 태그를 통해서도 똑같이 DI가 가능하다.
단, util:list 태그를 사용할 때는 반드시 list-class에 어떤 콜렉션을 사용할 것인지 명시해야한다.
'뉴렉쳐 스프링 프레임워크 정리 > Part1. DI' 카테고리의 다른 글
[Spring 개념정리] Java를 통한 Configuration (0) | 2023.07.14 |
---|---|
[Spring 개념정리] 어노테이션을 이용한 객체생성 (0) | 2023.07.14 |
[Spring 개념정리] @Autowired 어노테이션을 이용한 DI (0) | 2023.07.14 |
[Spring 개념정리] xml을 사용한 DI 및 IoC 컨테이너 사용법 (0) | 2023.07.14 |
[Spring 개념정리] DI와 IoC Container (0) | 2023.07.14 |