반응형
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>
반응형
'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 |
댓글