BeanDefinitionRegistryPostProcessor - 动态注册bean定义
BeanFactoryPostProcessor - 动态修改bean定义
BeanPostProcessor - 动态修改bean,即在bean初始化前后做些特殊操作
BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor以及BeanPostProcessor都属于Spring的后置处理器,可以实现它们以达到动态注册bean定义,动态修改bean定义,以及动态修改bean。
1、BeanDefinitionRegistryPostProcessor继承接口BeanFactoryPostProcessor,该接口新增postProcessBeanDefinitionRegistry方法,方法参数是BeanDefinitionRegistry对象,BeanDefinitionRegistry对象是bean定义的保存中心。
2、BeanFactoryPostProcessor是一个接口,它允许自定义修改应用程序上下文的bean定义,在基于bean factory上调整上下文的bean属性值。BeanFactoryPostProcessor可以与bean交互并修改bean定义,但从不使用bean实例。实现该接口,可以在spring的bean创建之前,修改bean的定义属性。
也就是说,Spring允许BeanFactoryPostProcessor在容器实例化任何其它bean之前读取配置元数据,并可以根据需要进行修改,例如可以把bean的scope从singleton改为prototype,也可以把property的值给修改掉。可以同时配置多个BeanFactoryPostProcessor,并通过设置’order’属性来控制各个BeanFactoryPostProcessor的执行次序。
这里我们想动态修改bean属性的key,也就是希望修改bean的定义。所以使用BeanFactoryPostProcessor即可。
在application context执行完标准初始化之后,所有bean definition都已加载,但还没有实例化任何bean。BeanFactoryPostProcessor允许插手修改context内部bean工厂,允许覆盖或添加属性
3、BeanPostProcessor也是一个接口,它允许动态修改应用程序上下文的bean,这时候bean已经实例化成功。
BeanPostProcessor,该接口我们也叫后置处理器,作用是在bean对象的实例化和依赖注入完毕后,在显示调用初始化方法的前后添加我们的逻辑。这里需要注意的是Bean实例化完毕以及依赖注入完成后触发的
package com.dpb.processor;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
* 自定义BeanPostProcessor实现类
* BeanPostProcessor接口的作用是:
* 我们可以通过该接口中的方法在bean实例化、配置以及其他初始化方法前后添加一些我们自己的逻辑
* @author dengp
*
*/
public class MyBeanPostProcessor implements BeanPostProcessor{
/**
* 实例化、依赖注入完毕,在调用显示的初始化之前完成一些定制的初始化任务
* 注意:方法返回值不能为null
* 如果返回null那么在后续初始化方法将报空指针异常或者通过getBean()方法获取不到bena实例对象
* 因为后置处理器从Spring IoC容器中取出bean实例对象没有再次放回IoC容器中
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("初始化 before--实例化的bean对象:"+bean+"\t"+beanName);
// 可以根据beanName不同执行不同的处理操作
return bean;
}
/**
* 实例化、依赖注入、初始化完毕时执行
* 注意:方法返回值不能为null
* 如果返回null那么在后续初始化方法将报空指针异常或者通过getBean()方法获取不到bena实例对象
* 因为后置处理器从Spring IoC容器中取出bean实例对象没有再次放回IoC容器中
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("初始化 after...实例化的bean对象:"+bean+"\t"+beanName);
// 可以根据beanName不同执行不同的处理操作
return bean;
}
}
三者执行顺序:
BeanDefinitionRegistryPostProcessor优先于BeanFactoryPostProcessor执行,BeanFactoryPostProcessor优先于BeanPostProcessor执行。