使用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执行。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。