使用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执行。

总结

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

相关文章

  • 详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用

    详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用

    这篇文章主要介绍了详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用,非常具有实用价值,需要的朋友可以参考下
    2017-05-05
  • 使用java的注解(用在java类的方法上的注解)方法

    使用java的注解(用在java类的方法上的注解)方法

    这篇文章主要介绍了使用java的注解(用在java类的方法上的注解)方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Java中MapStruct对象映射的实现

    Java中MapStruct对象映射的实现

    MapStruct是一种Java实体类映射框架,本文就来介绍一下Java中MapStruct对象映射的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-12-12
  • 详解JAVA 字节流和字符流

    详解JAVA 字节流和字符流

    这篇文章主要介绍了JAVA 字节流和字符流的的相关资料,文中讲解非常的细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Springmvc调用存储过程,并返回存储过程返还的数据方式

    Springmvc调用存储过程,并返回存储过程返还的数据方式

    这篇文章主要介绍了Springmvc调用存储过程,并返回存储过程返还的数据方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Intellij IDEA菜单栏不见了(Main Menu as Separate Toolbar)恢复菜单栏显示的解决办法

    Intellij IDEA菜单栏不见了(Main Menu as Separat

    有人问博主,关于Intellij IDEA菜单栏找不到了,被不小心的操作给隐藏了,怎么办?下面给大家分享解决方案,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • yaml文件中${}语法取值方式

    yaml文件中${}语法取值方式

    在Spring Boot中,配置文件中的${test.aa}等占位符的值可以通过系统属性或依赖的其他模块来获取,这意味着,可以通过JVM参数或者系统属性来指定这些值,例如,通过在启动命令中添加-Dtest.aa=your_value或在代码中通过
    2024-10-10
  • Spring AI与DeepSeek实战一之快速打造智能对话应用

    Spring AI与DeepSeek实战一之快速打造智能对话应用

    本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭建、配置API-KEY、创建ChatClient对象、创建对话接口、切换模型、使用prompt模板、流式对话等,感兴趣的朋友一起看看吧
    2025-03-03
  • 完美解决Spring Boot前端的Access-Control-Allow-Origin跨域问题

    完美解决Spring Boot前端的Access-Control-Allow-Origin跨域问题

    这篇文章主要介绍了完美解决Spring Boot前端的Access-Control-Allow-Origin跨域问题,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • Spark使用IDEA编写wordcount的示例演示

    Spark使用IDEA编写wordcount的示例演示

    这篇文章主要介绍了Spark使用IDEA编写wordcount的示例演示,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07

最新评论