Spring #10 생성자 DI

underlier12·2020년 2월 10일
0

SPRING

목록 보기
10/25

10. 생성자 DI

생성자를 통한 DI

이번엔 생성자를 통해 DI를 진행하는 방법을 알아본다. constructor-arg태그를 사용하며 내부에 value를 입력하면 된다.

만약 매개변수 타입에 의해 생성자 호출의 모호함이 있다면 다음과 같이 type을 추가하여 기재하면 된다.

위의 내용을 기입하기에는 양이 너무 많게 느껴질 수 있으며 다음과 같이 축약형으로 작성할 수 있다. 처리기 명칭을 부여하는데 첫번째 이유는 특정한 처리기에 의해 처리될 수 있도록 식별하기 위함이며 두번째는 태그이름을 식별하기 위함이다.

p 처리기를 사용하기위해 namespace 탭에 가서 체크를 해주면 위의 내용처럼 설정파일 처리기가 추가되어 있다.

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">

	<!-- 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>

Program.java

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();
	}

}

각각 다른 패턴이지만 동일하게 동작한다

profile
logos and alogos

0개의 댓글