Bean Life Cycle 통째로 테스트
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을 가져오기만 합니다. 그러면 다음과 같은 출력을 확인할 수 있습니다.
setBeanClassLoader() 실행합니다.
setBeanFactory() 실행합니다.
setResourceLoader() 실행합니다.
setApplicationEventPublisher() 실행합니다.
setMessageSource() 실행합니다.
setApplicationContext() 실행합니다.
afterPropertiesSet() 실행합니다.
customInit() 실행합니다.
어라.. 뭔가 빠졌습니다. 뭐가 빠졌을까요.. 구현한 것 중에 BeanPostProcessor와 관련된 callback들이 실행되지 않았습니다.
이론~ 왜이러는거야~~ 왜 BeanPostProcessor를 왕따시키는거야!!