当前位置: 首页 > news >正文

spring 优雅替换bean

方案一:使用 @Primary/@Qualifier 注解(优选)

如果有多个相同类型的 Bean 存在,可以将想要优先使用的 Bean 加上 @Primary 注解。

@Qualifier和@Primary注解的区别:@Primary注解用于标记具有相同类型的多个实例中的主要实例。而@Qualifier注解用于标记具有特定名称的Bean,以便在多个具有相同类型的Bean中选择特定的实例。

例如:接口ContextUserParser有AbsContextUserTokenParser和ContextUserTokenParser两个实现类,现在我想使用AbsContextUserTokenParser。为此配置config类:

package com.psbc.abs.config;import com.psbc.pfpj.yoaf.context.autoconfigure.YoafUserContextProperties;
import com.psbc.pfpj.yoaf.context.parser.AbsContextUserTokenParser;
import com.psbc.pfpj.yoaf.context.parser.ContextUserParser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;@Configuration
@Slf4j
public class AbsContextUserTokenConfig {@Bean@Primarypublic ContextUserParser absContextUserTokenParser(YoafUserContextProperties properties){return new AbsContextUserTokenParser(properties);}
}

方式二:自定义 Bean 替换逻辑

通过实现BeanDefinitionRegistryPostProcessor 接口,在其方法中根据特定条件来动态替换 Bean 的定义。

以下是一个简单示例:

package com.psbc.abs.support;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.GenericBeanDefinition;/*** 替换jar包内默认bean** @author lijunyu* @date 2023/10/23 17:55*/
@Slf4j
public class OverrideExistsBeanProcessor implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {replaceClass(registry,"contextUserParser", AbsContextUserTokenParser.class);}/*** 对容器内现有类进行替换** @param beanName 替换类名* @param clazz    替换类*/public void replaceClass(BeanDefinitionRegistry registry,String beanName, Class clazz) {if (registry.containsBeanDefinition(beanName)) {log.debug("bean:{} 删除", beanName);registry.removeBeanDefinition(beanName);GenericBeanDefinition beanDefinition = new GenericBeanDefinition();beanDefinition.setBeanClass(clazz);registry.registerBeanDefinition(beanName, beanDefinition);log.debug("bean:{} 替换成功", beanName);}}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {log.debug("beanFactory:{}", beanFactory);}
}

方式三:利用 Spring 的扩展机制

比如通过自定义 ApplicationContextInitializer 等在特定阶段进行 Bean 的替换操作。

相关文章:

  • HTML静态网页成品作业(HTML+CSS)—— 冶金工程专业展望与介绍介绍网页(2个页面)
  • SQL—DQL之执行顺序(基础)
  • Java语言编程考试难吗:深入剖析与应对策略
  • windows11家庭版、专业版、工作站版区别
  • 利用 Docker 简化Redis部署:快速搭建Redis服务
  • webserver服务器从零搭建到上线(八)|EpollPoller事件分发器类
  • 南澳葡萄酒发展论坛盛邀国际荐酒师香港协会共商开放关税中国发展
  • 【计算机毕业设计】基于SSM++jsp的在线云音乐系统【源码+lw+部署文档】
  • 使用Python库Matplotlib绘制常用图表类型
  • 新人学习笔记之(JavaScript作用域)
  • BurpSuite2024.5
  • C++——list
  • STM32学习问题总结(1)—CubeMX生成后下载无反应
  • SpringBoot+layui实现Excel导入操作
  • 软件磁盘阵列与LVM
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • es6(二):字符串的扩展
  • HTML5新特性总结
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JS函数式编程 数组部分风格 ES6版
  • Js基础知识(四) - js运行原理与机制
  • Lsb图片隐写
  • Making An Indicator With Pure CSS
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • MySQL用户中的%到底包不包括localhost?
  • nginx 负载服务器优化
  • PHP 7 修改了什么呢 -- 2
  • 关于Flux,Vuex,Redux的思考
  • 计算机在识别图像时“看到”了什么?
  • 浏览器缓存机制分析
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 设计模式(12)迭代器模式(讲解+应用)
  • 微信小程序:实现悬浮返回和分享按钮
  • 小程序开发中的那些坑
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​flutter 代码混淆
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #pragma multi_compile #pragma shader_feature
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (四)图像的%2线性拉伸
  • (一)u-boot-nand.bin的下载
  • (译) 函数式 JS #1:简介
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .mysql secret在哪_MYSQL基本操作(上)
  • .net FrameWork简介,数组,枚举
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证