BeanPostProcessor 사용 예
BeanPostProcessor 인터페이스는 다음과 같습니다.
이 인터페이스를 구현한 클래스들 입니다. 유용하니까 만들어 뒀을 텐데 언제 어떤걸 사용하면 좋을지는 나~~~중에 알아봐야겠네요.
- AbstractAdvisorAutoProxyCreator, AbstractAutoProxyCreator, ActionServletAwareProcessor, AdvisorAdapterRegistrationManager, AnnotationAwareAspectJAutoProxyCreator, ApplicationContextAwareProcessor, AspectJAwareAdvisorAutoProxyCreator, BeanNameAutoProxyCreator, DefaultAdvisorAutoProxyCreator, InstantiationAwareBeanPostProcessorAdapter, PersistenceAnnotationBeanPostProcessor, PersistenceExceptionTranslationPostProcessor, PortletContextAwareProcessor, RequiredAnnotationBeanPostProcessor, ScriptFactoryPostProcessor, ServletContextAwareProcessor, SimplePortletPostProcessor, SimpleServletPostProcessor
SIA(Spring In Action) 74쪽 부터 몇 장에 걸쳐 postProcessAfterInitialization 메소드를 사용하는 예제가 나와있습니다.
Reference에서는 이 인터페이스를 사용하는 예제라기 보다는 BeanFactory와 Applcation Context에 등록하는 방법을 주로 다루고 있습니다.
Member 객체의 id 속성 값이 "혜인이"이라면 "이쁘니"로 값을 바꾸는 예제를 만들어 보겠습니다.
Member keesun15 = getMember("keesun15");
assertTrue(keesun15.getId().equals("이쁘니"));
}
설정 내역은 다음과 같습니다.
<property name="id" value="혜인이">
</bean>
테스트는 실패합니다. keesun15 bean의 id 속성 값이 "혜인이"이기 때문입니다.
KeesunPostProcessor 를 구현합니다.
[#M_ more.. | less.. |
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class KeesunPostProcessor implements BeanPostProcessor {
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
return bean;
}
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("It's now working");
try {
Field idField = bean.getClass().getDeclaredField("id");
idField.setAccessible(true);
String id = (String) idField.get(bean);
System.out.println(id);
if(id.equals("혜인이"))
idField.set(bean, "이쁘니");
} catch (Exception e) {
e.printStackTrace();
}
return bean;
}
}
_M#]그리고 설정 파일에 bean으로 등록 해주면 테스트가 통과 합니다.[footnote]이 객체를 받아와서 사용할 일은 없어 보이니까..id나 name을 굳이 적어줄 필요가 없겠네요.[/footnote]
현재 사용중인 container가 ApplicationContext 종류이기 때문에 간단하게 bean으로 등록 해두기만 하면 container가 알아서 BeanPostProcessor를 읽어서 적용시켜 줍니다.
BeanFactory를 사용할 경우에는 Reference에 나온대로 addBeanPostProcessor를 소스 코드에서 등록해 줘야 합니다.
// now register any needed BeanPostProcessor instances
MyBeanPostProcessor postProcessor = new MyBeanPostProcessor();
factory.addBeanPostProcessor(postProcessor);
// now start using the factory