BeanFactoryPostProcessor和BeanPostProcessor是spring容器对外暴露的扩展接口,它们在作用和使用场景还是有一定的区别。
1.BeanFactoryPostProcessor
BeanFactoryPostProcessor定义如下:
public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
实现BeanFactoryPostProcessor接口的类,在spring初始化bean之前,可以修改bean的定义。Spring允许BeanFactoryPostProcessor在容器实例化任何其它bean之前读取配置元数据,并可以根据需要进行修改,例如可以把bean的scope从singleton改为prototype,也可以把property的值给修改掉。spring会自动检测配置中的BeanFactoryPostProcessor,在初始化的时候执行。
注意:BeanFactoryPostProcessor是在spring容器加载了bean的定义文件之后,在bean实例化之前执行的。接口方法的入参是ConfigurrableListableBeanFactory,使用该参数,可以获取到相关bean的定义信息。
例子:
public class MyFactoryPostProcessor implements BeanFactoryPostProcessor {
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("调用MyFactoryPostProcessor的postProcessBeanFactory");
BeanDefinition bd = beanFactory.getBeanDefinition("personBean");
System.out.println("属性值============" + bd.getPropertyValues().toString());
MutablePropertyValues pv = bd.getPropertyValues();
if (pv.contains("name")) {
pv.addPropertyValue("name", "小王");
}
}
}
配置:
<bean id="personBean" class="com.spring.test.postprocessor.PersonBean">
<property name="name" value="小张" />
</bean>
<bean id="myFactoryPostProcessor" class="com.spring.test.postprocessor.MyFactoryPostProcessor" />
2.BeanPostProcessor
BeanPostProcessor结构:
public interface BeanPostProcessor {
//在bean实例化之后,InitializingBean.afterPropertiesSet 和 init-method 之前
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
//在bean实例化之后,InitializingBean.afterPropertiesSet 和 init-method 之后
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
BeanPostProcessor是一个工厂钩子,允许自定义修改新的bean实例,如检查标记接口或包装代理。
ApplicationContext可以自动检测BeanPostProcessor bean的bean定义并将它们应用于随后创建的任何bean。BeanPostProcessor在执行bean的初始化方法前后,添加一些自己的处理逻辑。这里说的初始化方法,指的是下面两种:
1)bean实现了InitializingBean接口,对应的方法为afterPropertiesSet()
2)在bean定义的时候,通过init-method设置的方法
注意:BeanPostProcessor是在spring容器加载了bean的定义文件并且实例化bean之后执行的。BeanPostProcessor的执行顺序是在BeanFactoryPostProcessor之后。