>  기사  >  Java  >  Spring 컨테이너 확장 지점: Bean 후처리기

Spring 컨테이너 확장 지점: Bean 후처리기

php是最好的语言
php是最好的语言원래의
2018-08-10 15:07:112450검색

BeanPostProcessor(Bean 후처리자)는 Bean 등의 내부 값을 수정하는 데 사용됩니다.

BeanFactoryPostProcessor와 BeanPostProcessor는 모두 Spring이 Bean을 초기화할 때 노출되는 확장 지점입니다. 하지만 차이점은 무엇입니까?
"Bean Life Cycle 이해"의 그림을 보면 BeanFactoryPostProcessor가 BeanPostProcessor보다 훨씬 일찍 라이프사이클에서 가장 먼저 호출되는 것을 볼 수 있습니다. 이는 스프링 컨테이너가 Bean 정의 파일을 로드한 후 Bean이 인스턴스화되기 전에 실행됩니다. 즉, Spring은 컨테이너가 빈을 생성하기 전에 BeanFactoryPostProcessor가 빈 구성 메타데이터를 읽고 수정하도록 허용합니다. 예를 들어, 빈의 속성과 값을 추가하고, 빈이 자동 배선 후보인지 여부를 재설정하고, 빈의 종속성을 재설정하는 등의 작업을 수행합니다.

srping 구성 파일에는 여러 개의 BeanFactoryPostProcessor를 동시에 구성할 수 있으며, xml에 등록 시 'order' 속성을 설정하여 각 BeanFactoryPostProcessor의 실행 순서를 제어할 수 있습니다.

BeanFactoryPostProcessor 인터페이스는 다음과 같이 정의됩니다.

public interface BeanFactoryPostProcessor {
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}

인터페이스에는 postProcessBeanFactory 메소드가 하나만 있습니다. 이 메소드의 매개변수는 ConfigurableListableBeanFactory 유형입니다. 실제 개발에서는 BeanDefinition이라는 특정 Bean의 메타데이터 정의를 얻기 위해 getBeanDefinition() 메소드를 사용하는 경우가 많습니다.
Spring 컨테이너 확장 지점: Bean 후처리기

예를 보세요:
A bean은 구성 파일에 정의되어 있습니다:

<bean id="messi" class="twm.spring.LifecycleTest.footballPlayer">
    <property name="name" value="Messi"></property>
    <property name="team" value="Barcelona"></property>
</bean>

beanFactoryPostProcessorImpl 클래스 생성, BeanFactoryPostProcessor 인터페이스 구현:

public class beanFactoryPostProcessorImpl implements BeanFactoryPostProcessor{

    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("beanFactoryPostProcessorImpl");
        BeanDefinition bdefine=beanFactory.getBeanDefinition("messi");
        System.out.println(bdefine.getPropertyValues().toString());
        MutablePropertyValues pv =  bdefine.getPropertyValues();  
            if (pv.contains("team")) {
                PropertyValue ppv= pv.getPropertyValue("name");
                TypedStringValue obj=(TypedStringValue)ppv.getValue();
                if(obj.getValue().equals("Messi")){
                    pv.addPropertyValue("team", "阿根延");  
                }
        }  
            bdefine.setScope(BeanDefinition.SCOPE_PROTOTYPE);
    }
}

Call 클래스:

public static void main(String[] args) throws Exception {
    ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
    footballPlayer obj = ctx.getBean("messi",footballPlayer.class);
    System.out.println(obj.getTeam());
}

출력:

속성값 : length =2; bean 속성 'name'; bean 속성 'team'
Agenyan

"PropertyPlaceholderConfigurer 애플리케이션"에서 언급된 PropertyPlaceholderConfigurer 클래스는 BeanFactoryPostProcessor 인터페이스의 구현입니다. 컨테이너가 Bean을 생성하기 전에 클래스 정의(예: ${jdbc.url})의 자리 표시자를 속성 파일의 해당 콘텐츠로 대체합니다.

관련 권장 사항:

Spring Bean 확장 인터페이스 메서드 소개

ResourceLoaderAware 인터페이스 - [Spring 중국어 매뉴얼]

위 내용은 Spring 컨테이너 확장 지점: Bean 후처리기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.