본문 바로가기

SpringFramework Core - I. IoC 컨테이너/8. 컨테이너의 확장가능한 부분들

1.8.1.1. 예시: BeanPostProcessor 스타일의 Hello World

첫번째 예시는 기본적인 사용법을 알려준다. 예시에서는 커스텀한 BeanPostProcessor 구현체가 컨테이너에 의해 생성됨에 따라 각 bean들의 toString() 메소드를 호출하는 것을 보여준다. 그리고 결과 문자열을 시스템 콘솔에 출력한다. 

 

다음 예시는 커스텀한 BeanPostProcessor 구현 클래스의 정의를 보여준다.

package scripting;

import org.springframework.beans.factory.config.BeanPostProcessor;

public class InstantiationTracingBeanPostProcessor implements BeanPostProcessor {

    // 단순히 기존의 인스턴스화된 bean을 반환한다.
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        return bean;    // 잠재적으로 어떤 객체에 대한 참조도 이곳에서 반환받을 수 있다.
    }
    
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        System.out.println("Bean '" + beanName + "' created : " + bean.toString());
        return bean;
    }
}

다음 beans 요소는 InstantiationTracingBeanPostProcessor를 사용한다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:lang="http://www.springframework.org/schema/lang"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/lang
        https://www.springframework.org/schema/lang/spring-lang.xsd">
        
    <lang:groovy id="messenger" 
          script-source="classpath:org/springframework/scripting/groovy/Messenger.groovy">
        <lang:property name="message" value="Fiona Apple Is Just So Dreamy." />
    </lang:groovy>
    
    <!-- 위의 messenger bean이 인스턴스화 될 때, 이 커스텀 BeanPostProcessor 구현체가
         시스템 콘솔에 결과값을 출력할 것이다 -->
    <bean class="scripting.InstantiationTracingBeanPostProcessor" />
</beans>

InstantiationTracingBeanPostProcessor가 얼마나 단순히 정의되었는지 보라. 심지어 이름도 없으면서 bean이기 때문에 다른 bean에 의존성으로 주입될 수 있다. 위의 설정은 Groovy 스크립트의 보조를 받아 bean을 정의했다. 스프링의 동적 언어 지원은 '동적 언어 지원' 부분에서 자세히 확인할 수 있다.

 

다음 자바 애플리케이션은 위의 코드와 설정을 구동시킨다.

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.scripting.Messenger;

public final class Boot {

    public static void main(final String[] args) throws Exception {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("scripting/beans.xml");
        Messenger messenger = ctx.getBean("messenger", Messenger.class);
        System.out.println(messenger);
    }
}

위의 애플리케이션의 결과는 다음과 비슷하다.

Bean 'messenger' created : org.springframework.scripting.groovy.GroovyMessenger@272961
org.springframework.scripting.groovy.GroovyMessenger@272961