Spring的BeanFactoryPostProcessor和BeanPostProcessor区别
使用者可以通过实现BeanFactoryPostProcessor、BeanPostProcessor两个接口,处理初始化过程的bean。
一、BeanFactoryPostProcessor
该接口源码如下:
public interface BeanFactoryPostProcessor {
//可以通过beanFactory获取bean定义信息
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
BeanFactoryPostProcessor接口是针对bean容器的,它的实现类可以在当前BeanFactory初始化(spring容器加载bean定义文件)后,bean实例化之前修改bean的定义属性,达到影响之后实例化bean的效果。
也就是说,Spring允许BeanFactoryPostProcessor在容器实例化任何其它bean之前读取配置元数据,并可以根据需要进行修改,例如可以把bean的scope从singleton改为prototype,也可以把property的值给修改掉。可以同时配置多个BeanFactoryPostProcessor,并通过设置’order’属性来控制各个BeanFactoryPostProcessor的执行次序。
spring中内置了一些BeanFactoryPostProcessor接口实现类,如下所示:
二、BeanPostProcessor
该方法的源码如下:
public interface BeanPostProcessor {
//bean初始化之前调用
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
//bean初始化之后调用
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
BeanPostProcessor能在spring容器实例化bean之后,在执行bean的初始化方法前后,添加一些自己的处理逻辑。初始化方法包括以下两种:
1、实现InitializingBean接口的bean,对应方法为afterPropertiesSet
2、xml定义中,通过init-method设置的方法
BeanPostProcessor是BeanFactoryPostProcessor之后执行的。
spring中内置了一些BeanPostProcessor接口实现类,如下所示:
如果自定义了多个的BeanPostProcessor的实现类,通过实现Ordered接口,设置order属性,可以按照顺序执行实现类的方法。