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 속성 값이 “혜인이”이라면 “이쁘니”로 값을 바꾸는 예제를 만들어 보겠습니다.

    @Test public void beanPostProcessing(){
        Member keesun15 = getMember(“keesun15”);
        assertTrue(keesun15.getId().equals(“이쁘니”));
    }

설정 내역은 다음과 같습니다.

    <bean id=”keesun15″ class=”beanConfiguration.Member” >
        <property name=”id” value=”혜인이”>
    </bean>

테스트는 실패합니다. keesun15 bean의 id 속성 값이 “혜인이”이기 때문입니다.

KeesunPostProcessor 를 구현합니다.
[#M_ more.. | less.. |

 import java.lang.reflect.Field;

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]

<bean class=”beanConfiguration.KeesunPostProcessor” />

현재 사용중인 container가 ApplicationContext 종류이기 때문에 간단하게 bean으로 등록 해두기만 하면 container가 알아서 BeanPostProcessor를 읽어서 적용시켜 줍니다.

BeanFactory를 사용할 경우에는 Reference에 나온대로 addBeanPostProcessor를 소스 코드에서 등록해 줘야 합니다.

ConfigurableBeanFactory factory = new XmlBeanFactory(…);
           
    // now register any needed BeanPostProcessor instances
    MyBeanPostProcessor postProcessor = new MyBeanPostProcessor();
    factory.addBeanPostProcessor(postProcessor);

    // now start using the factory