使用Spring动态修改bean属性的key
作者:影࿐ེ
Spring动态修改bean属性的key
- 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执行。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
