Spring | Dependency Injection(DI)와 Bean | 응용 프로그램에서 Bean 이용


그럼 bean.xml에 정의 된 Bean을 응용 프로그램에서 이용해 보자. MySpringApp의 com.devkuma.spring 패키지에 “App.java"를 만들고, 아래처럼 소스 코드를 작성한다. 실행을 하면 SampleBean을 println하고 “Hello, this is Bean Sample !!“라고 표시된다.

package com.devkuma.spring;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class App {
 
    public static void main(String[] args) {
        ApplicationContext app = new ClassPathXmlApplicationContext("bean.xml");
        SampleBeanInterface bean1 = (SampleBeanInterface)app.getBean("bean1");
        System.out.println(bean1);
    }
 
}

실행 결과는 아래와 같다.

9월 03, 2017 4:38:49 오후 org.springframework.context.support.AbstractApplicationContext prepareRefresh
정보: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5ce65a89: startup date [Sun Sep 03 16:38:49 KST 2017]; root of context hierarchy
9월 03, 2017 4:38:49 오후 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
정보: Loading XML bean definitions from class path resource [bean.xml]
9월 03, 2017 4:38:50 오후 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
정보: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@79b4d0f: defining beans [bean1]; root of factory hierarchy
SampleBean [message=Hello, this is Bean Sample!!]

이처럼 실행한거 간단하게 설명을 하겠다.

1. Bean 설정 파일에서 ApplicationContext를 생성한다.

ApplicationContext app = new ClassPathXmlApplicationContext("bean.xml");

Bean 이용의 기본은 먼저 “ApplicationContext"라는 클래스의 인스턴스를 취득하는 것이다. 이 클래스는 이름 그대로 응용 프로그램의 컨텍스트를 관리한다. 이 경우 컨텍스트는 이를테면 “Bean"이라고 생각해도 좋다.

이 ApplicationContext를 만들려면 몇 가지 방법이 있는데, 그 하나는 Bean 설정 파일 (방금 만든 bean.xml)를 읽어 들여 그것을 바탕으로 작성하는 것이다. Bean 설정 파일에서 생성되는 ApplicationContext는 ClassPathXmlApplicationContext라는 클래스가 된다. 이것은 ClassPathXmlApplicationContext의 서브 클래스에서 XML 파일을 처리하는 기능이 추가된 것이다. 인수는 Bean 설정 파일 이름을 지정한다.

2. Bean를 취득하기

SampleBeanInterface bean1 = (SampleBeanInterface) app.getBean("bean1");

ApplicationContext 인스턴스가 준비되었다면, 다음은 간단하다. “getBean"메소드를 호출하는 것뿐이다. 이것은 인수에 지정한 이름의 Bean 인스턴스를 꺼내는 것이다. 먼저 bean.xml를 만들 때 **<bean id = “bean1”…>**라고 쓴 것을 기억하라. 이 id로 지정된 값이 getBean 인수에 사용된다.

이렇게 추출된 Bean은 일반 인스턴스와 동일하게 사용할 수 있다. 주목해야 하는 것은 Bean에는 이미 message 속성의 값이 설정되어 있다는 점이다. bean.xml에는 <property> 태그를 기술하고 있다.

이것은 bean.xml 값을 써서 변경하는 것만으로 소스 코드를 전혀 변경없이 사용하는 SampleBean의 내용을 바꿀 수 있다는 것이다. 이것이 “의존성 주입"이라는 것이다. 이는 다시 말하면 Bean을 사용하는 코드에 대해 일절 변경없이, 외부에서 Bean의 내용을 조작이 가능하다는 것이다.