Spring #07 Spring Bean Configuration

underlier12·2020년 2월 9일
0

SPRING

목록 보기
7/25

07. Spring Bean Configuration

스프링 DI 지시서 작성하기

Construction Injection 방법을 사용한 이전 코드에 이어 Setter Injection 방법을 추가하여 세터를 통한 설정 방법을 알아본다.

먼저 ExamConsole 인터페이스에 세터를 추가해주고 이를 구현한 InlineExamConsole, GridExamConsole 파일 모두 기본 생성자를 추가하고 세터 내용을 추가한다.

ExamConsole.java

package spring.di.ui;

import spring.di.entity.Exam;

public interface ExamConsole {
	void print();
	void setExam(Exam exam);
}

InlineExamConsole.java

package spring.di.ui;

import spring.di.entity.Exam;

public class InlineExamConsole implements ExamConsole {

	private Exam exam;
	
	public InlineExamConsole() {
		// TODO Auto-generated constructor stub
	}
	
	public InlineExamConsole(Exam exam) {
		this.exam = exam;
	}



	@Override
	public void print() {
		System.out.printf("total is %d, avg is %f\n", exam.total(), exam.avg());
	}



	@Override
	public void setExam(Exam exam) {
		this.exam = exam;		
	}

}

GridExamConsole.java

package spring.di.ui;

import spring.di.entity.Exam;

public class GridExamConsole implements ExamConsole {

	private Exam exam;
	
	public GridExamConsole() {
		// TODO Auto-generated constructor stub
	}
	
	public GridExamConsole(Exam exam) {
		this.exam = exam;
	}
	
	@Override
	public void print() {
		System.out.println(" total  |  avg  ");
		System.out.printf(" %3d  |  %3.2f  \n", exam.total(), exam.avg());
	}

	@Override
	public void setExam(Exam exam) {
		this.exam = exam;
	}

}

이후 Program 에서 DI에 대한 내용을 정의한 걸 스프링을 통해 완성하고자한다.

Program.java

package spring.di;

import spring.di.entity.Exam;
import spring.di.entity.NewlecExam;
import spring.di.ui.ExamConsole;
import spring.di.ui.GridExamConsole;
import spring.di.ui.InlineExamConsole;

public class Program {

	public static void main(String[] args) {
		
		/* 스프링에 지시하는 방법으로 변경 
		Exam exam = new NewlecExam();
		ExamConsole console = new GridExamConsole();
		
		console.setExam(exam);
		*/
		ExamConsole console = ?;
		console.print();
	}

}

setting 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"
	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"/>
	
	<!-- ExamConsole console = new GridExamConsole(); -->
	<bean id="console" class="spring.di.ui.GridExamConsole">
		<!-- console.setExam(exam); -->
		<property name="exam" ref="exam"></property>		
	</bean>
	
	

</beans>

다음과 같이 차례로 매칭시킬 수 있다. bean 태그에 작성하는데 exam이 id로 들어가며 class에는 해당 생성자가 들어가는데 이 때 패키지명을 함께 명시한다.

	<!-- Exam exam = new NewlecExam(); -->
	<bean id="exam" class="spring.di.entity.NewlecExam"/>

다음 내용도 마찬가지이며 다만 세터의 경우 property 태그에 포함이되어 name은 세터의 이름인 'setExam'이 전부 들어가지 않고 set을 빼고 capitalize를 제외한 exam만 들어간다. 이후 exam이 Injection될 때 자료형이냐 참조형이냐에 따라 다른데 자료형일 경우 value에 들어가며 참조형일 경우 ref에 들어가도록 구성한다.

	<!-- ExamConsole console = new GridExamConsole(); -->
	<bean id="console" class="spring.di.ui.GridExamConsole">
		<!-- console.setExam(exam); -->
		<property name="exam" ref="exam"></property>		
	</bean>
profile
logos and alogos

0개의 댓글