본문 바로가기
Spring|Spring-boot

[Spring] Dependency Injection (xml)

by oncerun 2020. 6. 16.
반응형

DI를 하기 위해 간단한 예제를 사용합니다.

 

package spring;

public class Program {

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

}

// new InlineExamConsole new GridExamConsole(exam) 이부분을 비워두고 대신 해줄수 있도록 spring의 도움을 받는다.
//만약 Exam과 ExamConsole이 변경된다면?  코드를 변경하지않기위해 외부 설정으로 빼는게 바람직하다.
//결합관계도 변경되어야한다.

 

두 개의 인터페이스를 준비했습니다. 

ExamConsole console 출력을 담당하며

Exam 개체를 담당합니다.

 

이제 NewExam객체를 생성해 변경되는 InlineExamConsole과 GridExamConsole 둘 중 변경에 있어서 자유롭게 할 수 있도록 spring의 도움을 받는 것입니다.

 

이제 spring DI지시서를 이용합니다 (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이라는 태그를 이용해 생성할 객체를 지정합니다. -->

	<!--  id에는 생성할 객체의 변수명  class에서는 패키지명을 포함한 클래스를 작성해줍니다.
			Exam exam = new NewExam(); 									-->
	<bean id="exam" class="spring.NewExam"/>
	
	<!-- ExamConsole console = new GridExamConsole(); -->
	<bean id="console" class="spring.GridExamConsole">
	<!-- 	console.setExam(exam); -->
	<!--setExam()은 규칙에따라 exam으로 변환됩니다.  exam은 메소드명 -->
	<!-- value는 상수 문자  ref는 참조형 exam객체를 name=" exam"메서드에 인자 ref="exam"로 넣습니다. -->
	<property name="exam" ref="exam"/>	
    
	</bean>
	
</beans>

 

이제 IoC (ApplicationContext)를 이용합니다.

 

실질적인 클래스는 여러 가지인데 차이점은 지시서를 넘길 때 위치를 어떻게 알려주느냐에 따라서 구현하는 클래스가 달라집니다.

 

ClassPathXmlApplicationContext - 애플리케이션의 루트로부터 경로를 지정할 때 사용합니다. 

 

FileSystemXmlApplicationContext - xml이 파일 시스템의 경로로부터 찾아갈 경우 사용합니다.

 

XmlWebApplicationContext - 웹에 두고 url을 통해 지정합니다.

 

AnnotationConfigApplicationContext - 어노테이션을 이용할 때 사용합니다.

 

Maven에서 SpringContext 라이브러리를 받아 pom.xml에 설정합니다.

 

	<dependencies>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>5.2.6.RELEASE</version>
		</dependency>

	</dependencies>

 

만약 객체를 변경해야한다면 setting.xml에서 클래스만 변경해준다면 소스의 수정 없이 쉽게 변경할 수 있습니다.

 

package spring;

import org.omg.CORBA.portable.ApplicationException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Program {

	public static void main(String[] args) {
		/* 
		 * Exam exam = new NewExam();
		   ExamConsole console = new InlineExamConsole();
		 * console.setExam(exam);
		 */
		ApplicationContext context =
				new ClassPathXmlApplicationContext("spring/setting.xml");
//			id값을 가지고 가져오되 형식변환을해야합니다. Object형으로 반환
			ExamConsole console = (ExamConsole) context.getBean("console");
		
//	 		자료형으로 꺼내기 인터페이스에 참조될 수 있는 형식을 찾아달라는 것. 두가지가 있다면 구분해야합니다.		
//			ExamConsole console = context.getBean(ExamConsole.class);
			console.print();
	}

}

 

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">
	<!-- 스프링은 beans이라는 태그를 이용해 생성할 객체를 지정합니다. -->

	<!--  id에는 생성할 객체의 변수명  class에서는 패키지명을 포함한 클래스를 작성해줍니다.
			Exam exam = new NewExam(); 									-->
	<bean id="exam" class="spring.NewExam"/>
	
	<!-- ExamConsole console = new GridExamConsole(); -->
	<bean id="console" class="spring.InlineExamConsole">
	<!-- 	console.setExam(exam); -->
	<!--setExam은 규칙에따라 exam으로 변환됩니다.  exam은 메소드명 -->
	<!-- value는 상수 문자  ref는 참조형 -->
	<property name="exam" ref="exam"/>	
	</bean>
	
</beans>

 

 

bean class 가 inlineExamConsole.일경우
bean class 가 GridExamConsole.일경우

 

반응형

'Spring|Spring-boot' 카테고리의 다른 글

[spring] 의존 주입  (0) 2020.06.17
[spring] @Configuration  (0) 2020.06.17
[Spring] IoC 컨테이너  (0) 2020.06.15
[Spring] DI(Dependency Injection)  (0) 2020.06.15
[Spring] 느슨한 결합력과 인터페이스  (0) 2020.06.15

댓글