一、作用:

BeanFactoryPostProcessor:BeanFactory的后置处理器;

         在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容;

         所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建

BeanFactoryPostProcessor原理:

1)、IOC容器创建对象

2)、invokeBeanFactoryPostProcessors(beanFactory);

     如何找到所有的BeanFactoryPostProcessor并执行他们的方法;

            1)、直接在beanFactory中找到所有类型是BeanFactoryPostProcessor的组件,并执行他们的方法

            2)、在初始化创建其它组件前面执行

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor{
    @Override
    public void postProcessBeanFactory(
            ConfigurableListableBeanFactory beanFactory) throws BeansException {
        String[] beanNames = beanFactory.getBeanDefinitionNames();
        System.out.println("all bean names are " + Arrays.asList(beanNames));
        System.out.println("MyBeanFactoryPostProcessor execute......");
    }
}
@Configuration
public class ConfigurationBean {
    @Bean
    public MyBeanFactoryPostProcessor myBeanFactoryPostProcessor() {
        return new MyBeanFactoryPostProcessor();
    }
    
    @Bean
    public Person person() {
        return new Person();
    }
}
public class Person implements ApplicationContextAware, BeanNameAware,
        EmbeddedValueResolverAware {
    private ApplicationContext applicationContext;

    @Override
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        String resolve = resolver.resolveStringValue("你好,${os.name},我是#{36*10}");
        System.out.println(resolve);
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("this bean name is " + name);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        this.applicationContext = applicationContext;
    }
    
    public Person() {
        System.out.println("person construct ....");
    }
}
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(
                ConfigurationBean.class);

打印

all bean names are [org.springframework.context.annotation.internalConfigurationAnnotationProcessor, org.springframework.context.annotation.internalAutowiredAnnotationProcessor, org.springframework.context.annotation.internalRequiredAnnotationProcessor, org.springframework.context.annotation.internalCommonAnnotationProcessor, org.springframework.context.event.internalEventListenerProcessor, org.springframework.context.event.internalEventListenerFactory, configurationBean, myBeanFactoryPostProcessor, person]
MyBeanFactoryPostProcessor execute......
person construct ....
this bean name is person
你好,Windows 7,我是360

 二、应用

如:PlaceholderConfigurerSupport用来解析bean属性配置中的占位符,如数据源配置属性${jdbc.url},${jdbc.username}