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() 메소드를 사용하는 경우가 많습니다.
예를 보세요:
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})의 자리 표시자를 속성 파일의 해당 콘텐츠로 대체합니다.
관련 권장 사항:
ResourceLoaderAware 인터페이스 - [Spring 중국어 매뉴얼]
위 내용은 Spring 컨테이너 확장 지점: Bean 후처리기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!