이번엔 생성자를 통해 DI를 진행하는 방법을 알아본다. constructor-arg
태그를 사용하며 내부에 value를 입력하면 된다.
만약 매개변수 타입에 의해 생성자 호출의 모호함이 있다면 다음과 같이 type을 추가하여 기재하면 된다.
위의 내용을 기입하기에는 양이 너무 많게 느껴질 수 있으며 다음과 같이 축약형으로 작성할 수 있다. 처리기 명칭을 부여하는데 첫번째 이유는 특정한 처리기에 의해 처리될 수 있도록 식별하기 위함이며 두번째는 태그이름을 식별하기 위함이다.
p 처리기를 사용하기위해 namespace
탭에 가서 체크를 해주면 위의 내용처럼 설정파일 처리기가 추가되어 있다.
<?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">
<!-- Exam exam = new NewlecExam(); -->
<bean id="exam" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="20"/>
<!-- <bean id="exam" class="spring.di.entity.NewlecExam">
<constructor-arg name="kor" value="10"/>
<constructor-arg name="eng" value="20"/>
<constructor-arg name="math" value="30"/>
<constructor-arg name="com" value="40"/>
</bean> -->
<!-- ExamConsole console = new GridExamConsole(); -->
<bean id="console" class="spring.di.ui.InlineExamConsole">
<!-- console.setExam(exam); -->
<property name="exam" ref="exam"></property>
</bean>
</beans>
package spring.di;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import spring.di.entity.Exam;
import spring.di.ui.ExamConsole;
public class Program {
public static void main(String[] args) {
/* 스프링에 지시하는 방법으로 변경
Exam exam = new NewlecExam();
ExamConsole console = new GridExamConsole();
console.setExam(exam);
*/
ApplicationContext context =
new ClassPathXmlApplicationContext("spring/di/setting.xml");
Exam exam = context.getBean(Exam.class);
System.out.println(exam.toString());
ExamConsole console = (ExamConsole) context.getBean("console");
// ExamConsole console = context.getBean(ExamConsole.class);
console.print();
}
}
각각 다른 패턴이지만 동일하게 동작한다