使用Spring动态修改bean属性的key

 更新时间:2024年05月16日 09:16:10   作者:影࿐ེ  
这篇文章主要介绍了使用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执行。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java 中break如何跳出外部循环

    java 中break如何跳出外部循环

    这篇文章主要介绍了java 中break如何跳出外部循环,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java集合功能与用法实例详解

    Java集合功能与用法实例详解

    这篇文章主要介绍了Java集合功能与用法,结合实例形式详细分析了java集合的基本概念、功能、原理、操作技巧与使用注意事项,需要的朋友可以参考下
    2020-04-04
  • 理解Java当中的回调机制(翻译)

    理解Java当中的回调机制(翻译)

    今天我要和大家分享一些东西,举例来说这个在JavaScript中用的很多。我要讲讲回调(callbacks)。你知道什么时候用,怎么用这个吗?你真的理解了它在java环境中的用法了吗?当我也问我自己这些问题,这也是我开始研究这些的原因
    2014-10-10
  • Mybatis的Mapper代理对象生成及调用过程示例详解

    Mybatis的Mapper代理对象生成及调用过程示例详解

    这篇文章主要为大家介绍了Mybatis的Mapper代理对象生成及调用过程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • idea导入maven工程的三种方法

    idea导入maven工程的三种方法

    这篇文章主要介绍了idea导入maven工程的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Java Spring声明式事务失效情况解决办法(天翼通讯)

    Java Spring声明式事务失效情况解决办法(天翼通讯)

    在Spring的声明式事务中,多线程环境下事务会失效,因为子线程无法继承父线程的事务上下文,这篇文章主要介绍了Java Spring声明式事务失效情况解决办法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-10-10
  • java8中的Collectors.groupingBy用法详解

    java8中的Collectors.groupingBy用法详解

    这篇文章主要介绍了java8中的Collectors.groupingBy用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • java中删除数组中重复元素方法探讨

    java中删除数组中重复元素方法探讨

    这个是一个老问题,但是发现大多数人说的还不够透。小弟就在这里抛砖引玉了,欢迎拍砖
    2013-10-10
  • 解决Eclipse打开.java文件异常,提示用系统工具打开的问题

    解决Eclipse打开.java文件异常,提示用系统工具打开的问题

    这篇文章主要介绍了解决Eclipse打开.java文件异常,提示用系统工具打开的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Spring Boot Admin管理监控数据的方法

    Spring Boot Admin管理监控数据的方法

    本篇文章主要介绍了Spring Boot Admin管理监控数据的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12

最新评论