使用者可以通过实现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接口实现类,如下所示:
Spring的BeanFactoryPostProcessor和BeanPostProcessor区别

二、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接口实现类,如下所示:
Spring的BeanFactoryPostProcessor和BeanPostProcessor区别
如果自定义了多个的BeanPostProcessor的实现类,通过实现Ordered接口,设置order属性,可以按照顺序执行实现类的方法。

三、例子

分类:

技术点:

相关文章: