Bean Life Cycle
BeanNameAware 테스트
BeanClassLoaderAware 테스트
BeanFactoryAware 테스트
MessageSource 사용 예
ApplicationEvent 사용 예
MessageSource 사용 예
BeanPostProcessor 사용 예

다 비슷한 테스트 들인데 하나씩 테스트 하기가 지겨워서 Bean Life Cycle에 관여하는 모든 인터페이스를 전부 구현하도록 했습니다.

/**
 *
 */
package net.agilejava.jedi.spring.beanLifeCycle;

import javax.servlet.ServletContext;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanClassLoaderAware;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.context.MessageSource;
import org.springframework.context.MessageSourceAware;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.ResourceLoader;
import org.springframework.web.context.ServletContextAware;

/**
 * @author keesun
 *
 */
public class BeanLifeCycleTestBean implements BeanNameAware,
    BeanClassLoaderAware, BeanFactoryAware, ResourceLoaderAware,
    ApplicationEventPublisherAware, MessageSourceAware,
    ApplicationContextAware, ServletContextAware, BeanPostProcessor,
    InitializingBean{

    String beanName;

    ClassLoader classLoader;

    BeanFactory beanFactory;

    ResourceLoader resourceLoader;

    public void setBeanName(String beanName) {
        System.out.println("setBeanName() 실행합니다.");
        this.beanName = beanName;
    }

    public String getBeanName(){
        return beanName;
    }

    public void setBeanClassLoader(ClassLoader classLoader) {
        System.out.println("setBeanClassLoader() 실행합니다.");
        this.classLoader = classLoader;
    }

    public ClassLoader getClassLoader() {
        return classLoader;
    }

    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("setBeanFactory() 실행합니다.");
        this.beanFactory = beanFactory;
    }

    public BeanFactory getBeanFactory() {
        return beanFactory;
    }

    public void setResourceLoader(ResourceLoader resourceLoader) {
        System.out.println("setResourceLoader() 실행합니다.");
        this.resourceLoader = resourceLoader;
    }

    public ResourceLoader getResourceLoader(){
        return resourceLoader;
    }

    public void setApplicationEventPublisher(ApplicationEventPublisher arg0) {
        System.out.println("setApplicationEventPublisher() 실행합니다.");
    }

    public void setMessageSource(MessageSource arg0) {
        System.out.println("setMessageSource() 실행합니다.");
    }

    public void setApplicationContext(ApplicationContext arg0) throws BeansException {
        System.out.println("setApplicationContext() 실행합니다.");
    }

    public void setServletContext(ServletContext servletContext){
        System.out.println("setServletContext() 실행합니다.");
    }

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization() 실행합니다.");
        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization() 실행합니다.");
        return bean;
    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet() 실행합니다.");
    }

    public void customInit(){
        System.out.println("customInit() 실행합니다.");
    }
}

테스트에서는 getBean으로 해당 bean을 가져오기만 합니다. 그러면 다음과 같은 출력을 확인할 수 있습니다.

setBeanName() 실행합니다.
setBeanClassLoader() 실행합니다.
setBeanFactory() 실행합니다.
setResourceLoader() 실행합니다.
setApplicationEventPublisher() 실행합니다.
setMessageSource() 실행합니다.
setApplicationContext() 실행합니다.
afterPropertiesSet() 실행합니다.
customInit() 실행합니다.

어라.. 뭔가 빠졌습니다. 뭐가 빠졌을까요.. 구현한 것 중에 BeanPostProcessor와 관련된 callback들이 실행되지 않았습니다.

이론~ 왜이러는거야~~ 왜 BeanPostProcessor를 왕따시키는거야!!