Src 폴더 아래에 Package명이 spring.di.hello인 이름이 Hello인 인터페이스를 하나 생성한다.
package spring.di.hello; public interface Hello { public abstract void sayHello();
} |
위에서 생성한 Hello를 Inplement하는 KorHello 와 EngHello 파일을 생성한다.
package spring.di.hello; public class KorHello implements Hello{ public void sayHello(){ System.out.println("안녕하세요~*"); } } |
package spring.di.hello;
public class EngHello implements Hello {
@Override public void sayHello() { // TODO Auto-generated method stub System.out.println("How are you?"); } } |
위 생성한 파일을 실행해 줄 TestHello.java 파일을 생성한다.
import spring.di.hello.Hello; import spring.di.hello.KorHello;
public class TestHello {
public static void main(String[] args){ //Dependency Injection에서는 // 기존의 아래 10~11 Line처럼 사용하지 않는다. Hello h=new KorHello();//Line 10 h.sayHello(); //Line 11 } } | |
다시말해 TestHello가 sayHello()를 실행하기 위해 KorHello class에 의존하여 실행하게끔 되어 있는게 기존 방식이다.
즉 TestHello와 KorHello는 의존관계이다. 이를 Spring에서는 직접 의존하지 않고 컨테이너에 의존하여 11라인을 출력한다.
즉, 이를 실행하여 주는 환경에서 외부 설정파일에 의존하여 소스코드의 재컴파일없이 변경할 수 있도록 하여 준다. |
이제 아래와 같이 외부 설정파일(applicationContext.xml)을 생성하여 본다.
applicationContext.xml |
<?xml version="1.0" encoding="UTF-8"?> <!-- Spring FrameWork Configuration File --> <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-2.5.xsd"> <!-- Prgram에서 hello라는 이름으로 Srping container에게 요청을 하면 Container가 KorHello 클래스의 객체를 생성하여 Return하여 준다. --> <bean name="hello" class="spring.di.hello.KorHello"/> </beans> |
위의 생성한 applicationContext.xml 파일을 통해 Data Injection을 구현하기 위해 TestHello.java 파일을 아래와 같이 변경한다.
TestHello.java |
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import spring.di.hello.Hello;
public class TestHello { public static void main(String[] args){ //Dependency Injection에서는 // 기존의 아래 10~11 Line처럼 사용하지 않는다. /*Hello h=new KorHello(); //Line 10 h.sayHello(); //Line 11*/
//1.Spring 설정 파일의 위치를 Resource 객체로 생성. //org.springframework.core.io.Resource Resource resource=new ClassPathResource("applicationContext.xml");
//2. Spring FrameWork에서 객체를 생성해 주는 BeanFactory 객체를 얻어온다. // BeanFactory 객체를 얻어올 때는 설정 파일의 위치를 알려줘야 한다. BeanFactory factory=new XmlBeanFactory(resource);
//3. BeanFactory 에게 객체 생성을 요청 Object obj=factory.getBean("hello"); Hello hello=(Hello)obj; hello.sayHello(); } } |
Result :
<bean name="hello" class="spring.di.hello.KorHello"/> |
<bean name="hello" class="spring.di.hello.EngHello"/> |
안녕하세요~* |
How are you? |
심화학습
TestHello.java를 아래와 같이 변경. |
private Hello hello; public TestHello(){}; public TestHello(Hello hello){ this.hello=hello; } public void useHello(){ this.hello.sayHello(); } public static void main(String[] args){ Resource resource=new ClassPathResource("applicationContext.xml");
BeanFactory factory=new XmlBeanFactory(resource);
Object obj=factory.getBean("testHello");//외부로 부터 "testHello"라는 이름과 매치된 객체를 받아온다. TestHello th=(TestHello)obj; th.useHello(); |
위 소스에서 보듯이 이번에는 TestHello는 hello 객체를 참조하고 있다.
applicationContext.xml |
<bean name="testHello" class="TestHello"> <constructor-arg ref="hello"/> </bean> testHello라는 이름이 호출되면 TestHello의 객체를생성하는데 이때 생성자의 Argument로 hello를 참조한다. |
'Java' 카테고리의 다른 글
Spring 초간단 실습 (0) | 2010.06.15 |
---|---|
Struts 1 설치 및 간단한 실습 (0) | 2010.06.14 |
Filter (0) | 2010.06.13 |
File Upload API (0) | 2010.06.13 |
Spring에서 자주 사용되어지는 API 묶음 (0) | 2010.06.13 |
Spring 설치 및 이클립스와의 연동 (1) | 2010.06.13 |
Tomcat 설치 및 간단한 환경설정 (0) | 2010.04.22 |
0401 Report Source (0) | 2010.04.01 |
PrintWriter Ex. Source (0) | 2010.04.01 |
PrintWriter Ex. Source (0) | 2010.04.01 |