Hello.java
- package springbook.etc;
- public class Hello {
- private String name;
- private Printer printer;
- public String sayHello() {
- return "Hello " + name;
- }
- public void print() {
- this.printer.print(sayHello());
- }
- public void setName(String name) {
- this.name = name;
- }
- public void setPrinter(Printer printer) {
- this.printer = printer;
- }
- }
Printer.java(인터페이스)
-
package springbook.etc;
- public interface Printer {
- void print(String message);
- }
StringPrinter.java(인터페이스 Printer.java 구현체)
- package springbook.etc;
- public class StringPrinter implements Printer {
- private StringBuffer buffer = new StringBuffer();
- public void print(String message) {
- this.buffer.append(message);
- }
- public String toString() {
- return this.buffer.toString();
- }
- }
TestHello.java(DI 정보 테스트)
- package springbook.etc;
- import org.junit.Test;
- import static org.junit.Assert.*;
- import static org.hamcrest.CoreMatchers.*;
- import org.springframework.beans.factory.config.BeanDefinition;
- import org.springframework.beans.factory.config.RuntimeBeanReference;
- import org.springframework.beans.factory.support.RootBeanDefinition;
- import org.springframework.context.support.StaticApplicationContext;
- public class TestHello {
- @Test
- public void testHelloBean() {
- //IoC 컨테이너 생성. 생성과 동시에 컨테이너로 동작한다.
- StaticApplicationContext ac = new StaticApplicationContext();
- //Hello 클래스를 hello1이라는 이름의 싱글톤 빈으로 컨테이너에 등록한다.
- ac.registerSingleton("hello1", Hello.class);
- //IoC 컨테이너가 등록한 빈을ㄹ 생성했는지 확인하기 위해 빈을 요청하고 Null이 아닌지 확
- Hello hello1 = ac.getBean("hello1", Hello.class);
- assertThat(hello1, is(notNullValue()));
- //빈 메타정보를 담은 오브젝트를 만든다. 빈 클래스는 Hello로 지정한다.
- //<bean class="springbook.etc.Hello" />에 해당하는 메타정
- BeanDefinition helloDef = new RootBeanDefinition(Hello.class);
- //빈의 name프로퍼티에 들어갈 값을 지정한다.
- //<property name="name" value="Spring" />에 해당한다.
- helloDef.getPropertyValues().addPropertyValue("name", "Spring");
- //앞에서 생성한 빈 메타정보를 hello2라는 이름을 가진 빈으로 해서 등록흔다.
- //<bean id="hello2" /> 에 해당한다.
- ac.registerBeanDefinition("hello2", helloDef);
- //BeanDefinition으로 등록된 빈이 컨테이너에 의해 만들어지고 프로퍼티에 설정이 됐는지 확인한다.
- Hello hello2 = ac.getBean("hello2", Hello.class);
- assertThat(hello2.sayHello(), is("Hello Spring"));
- //처음 등록한 빈과 두 번쨰 등록한 빈이 별개의 오브젝트임을 확인
- assertThat(hello1, is(not(hello2)));
- assertThat(ac.getBeanFactory().getBeanDefinitionCount(), is(2));
- }
- @Test
- public void registerBeanWithDependency() {
- StaticApplicationContext ac = new StaticApplicationContext();
- //StringPrinter 타입이며, printer라는 이름을 가진 빈을 등록한다.
- ac.registerBeanDefinition("printer", new RootBeanDefinition(StringPrinter.class));
- BeanDefinition helloDef = new RootBeanDefinition(Hello.class);
- helloDef.getPropertyValues().addPropertyValue("name", "Spring"); //
- helloDef.getPropertyValues().addPropertyValue("printer", new RuntimeBeanReference("printer"));
- ac.registerBeanDefinition("hello", helloDef);
- Hello hello = ac.getBean("hello", Hello.class);
- hello.print();
- assertThat(ac.getBean("printer").toString(), is("Hello Spring"));
- }
- }
IoC 컨테이너가 POJO 클래스와설정 메타정보를 이용해 어떻게 최종사용할 애플리케이션 런타임 오브젝트를 만들어내는 지 이해할 수 있을 것이다. 이렇게 애플리케이션을 구성하는 빈 오브젝트를 생성하는 것이 IoC 컨테이너의 핵심이다. IoC 컨테이너는 일단 빈 오브젝트가 생성되고 관계가 만들어지면 그 뒤로는 거의 관여하지 않는다. 기본적으로 싱글톤 빈은 애플리케이션 컨텍스트의 초기화 작업 중에 모두 만들어진다.
이 글은 스프링노트에서 작성되었습니다.
'Java > Framework & Libs' 카테고리의 다른 글
Logging Library, 자바에 대한 기록 (0) | 2011.05.03 |
---|---|
XML로 만든 빈 설정 메타정보 (0) | 2011.04.04 |
인터페이스를 두고 DI를 적용해야 하는 이유 (0) | 2011.03.29 |
Maven 기본 Phase 와 Goal의 관계 (0) | 2011.03.25 |
Spring 3.0 버전을 활용하다가 CGLIB is required to process @Configuration classes Exception 발생 (14) | 2011.03.18 |