SpringBoot项目根据配置文件初始化并向容器注册Bean

SpringBoot项目根据配置文件初始化并向容器注册Bean


文章目录

  • SpringBoot项目根据配置文件初始化并向容器注册Bean
    • @[TOC]
  • 前言
  • 一、场景图示
  • 二、实现
    • 1.定义一个Condition实现类
    • 2.按照配置装配bean
  • 总结

前言

在开发过程种有这种场景,我们在使用数据存储的时候定义了一个接口,接口的实现有很多,例如有es的数据存储实现,mysql的数据存储实现,每个项目只能选择一种数据库。这个时候我们再写代码的时候就可以考虑在配置文件中配置一个数据库类型,启动的时候只对配置的数据库进行初始化,并向容器注册对应的bean

一、场景图示

描述:每个项目都有子集不同的配置,A项目配置了ES数据库,启动的时候我们根据A配置来实现数据处理接口的实现类为ES处理实现类(A类),则不初始化以及注册B、C两个类。其他同理。

在这里插入图片描述

二、实现

1.定义一个Condition实现类

定义Condition实现类的目的是获取配置文件配置,判断是否需要加载注入某个bean

public class MilvusBeanConditional implements Condition {/*** 是否初始化Milvus*/@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {Environment environment = context.getEnvironment();String dbServiceFlag = environment.getProperty("model.vector.dbType");if (StringUtils.equals(dbServiceFlag, "Milvus")) {return true;} else {return false;}}
}
public class EsBeanConditional implements Condition {/*** 是否初始化es*/@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {Environment environment = context.getEnvironment();String dbServiceFlag = environment.getProperty("model.vector.dbType");if (StringUtils.equals(dbServiceFlag, "es")) {return true;} else {return false;}}
}
public class MyssqlBeanConditional implements Condition {/*** 是否初始化Myssql*/@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {Environment environment = context.getEnvironment();String dbServiceFlag = environment.getProperty("model.vector.dbType");if (StringUtils.equals(dbServiceFlag, "Myssql")) {return true;} else {return false;}}
}

2.按照配置装配bean

更具上述定义的matches方法来实现是否需要装配某个bean,
@Conditional(MilvusBeanConditional.class) 可以用在方法上也可以用在类上
在数据库配置为Milvus数据库的时候,就会装配MilvusServiceClient并注入springboot容器

    @Bean@Conditional(MilvusBeanConditional.class)  //根据MilvusBeanConditional类的matches方法来判断实现执行public MilvusServiceClient milvusServiceClient() {return new MilvusServiceClient(ConnectParam.newBuilder().withUri(host + ":" + milvusPort).build());}

总结

@Conditional注解这个注解在Spring4中引入,其主要作用就是判断条件是否满足,从而决定是否初始化并向容器注册Bean,自定义实现一个bean时只需要实现Condition接口中的matches方法即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/746963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop大数据应用:Linux 部署 HDFS 分布式集群

目录 一、实验 1.环境 2.Linux 部署 HDFS 分布式集群 3.Linux 使用 HDFS 文件系统 二、问题 1.ssh-copy-id 报错 2. 如何禁用ssh key 检测 3.HDFS有哪些配置文件 4.hadoop查看版本报错 5.启动集群报错 6.hadoop 的启动和停止命令 7.上传文件报错 8.HDFS 使用命令 一…

米尔更新面向工业产品的软件系统-基于瑞米派(Remi Pi)

米尔电子发布的瑞萨第一款MPU生态板卡——瑞米派(Remi Pi)自上市当天200套售罄,获得不少新老用户的青睐。为感谢大家的支持,米尔加推300套瑞米派活动,以补贴价回馈大家,抢完即止! 不仅如此&…

上海亚商投顾:沪指震荡调整 飞行汽车概念股持续爆发

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡调整,深成指走势稍强,创业板指一度涨超1%,黄白二线走势分化&a…

简单算命脚本

效果展示 文件内容 main.py文件 import json import random import time# 别挂配置数据 gua_data_path "data.json"# 别卦数据 gua_data_map {} fake_delay 10# 读取别卦数据 def init_gua_data(json_path):with open(gua_data_path, r, encodingutf8) as fp:gl…

centos7 install rocketmq 宿主机快速搭建RocketMQ单机开发环境

为什么采用宿主机而不采用 Docker 方式快速搭建 在搭建 RocketMQ 测试环境时,我们可以选择在宿主机上直接安装和配置,也可以使用 Docker 容器来快速搭建。然而,为什么我们选择了在宿主机上安装而不是使用 Docker 方式呢? 调整配置…

攻防世界-CatchCat

题目:附件为 分析题目,可知文件里面是一堆关于GPS的数据,所以我们将GPS的轨迹绘制出来(GPS地图绘制网站:GPS Visualizer:从 GPS 数据文件绘制地图) 将文件导入后绘制地图,得到如图&a…

【优选算法】专题1 -- 双指针 -- 移动零

前言: 📚为了提高算法思维,我会时常更新这个优选算法的系列,这个专题是关于双指针的练习 🎯个人主页:Dream_Chaser~-CSDN博客 一.移动零(easy) 描述: 「数组分两块」是⾮…

架构设计的核心目的与意义

以史为鉴,对我们了解架构设计的目的很有帮助。谈到架构设计,相信每个技术人员都是耳熟能详,但如果深入探讨一下,“为何要做架构设计?”或者“架构设计目的是什么?”类似的问题,大部分人可能从来…

单片机卡死的几大原因、分析、解决

阅读引言: 本文我想给大家分享一下我在学习过程中遇到的以及了解到的一些导致单片机运行卡死(死锁)的一些常见原因和解决办法, 请注意, 只是列举,并不是全部, 因为导致单片机运行卡死的原因无穷…

Qt-QPainter drawText方法不同重载之间的区别

QPainter类的drawText方法有如下重载: void drawText(const QPointF &position, const QString &text) void drawText(const QPoint &position, const QString &text) void drawText(int x, int y, const QString &text) void drawText(co…

APP在应用商店该如何做好节日营销

38妇女节刚刚过去,不少商家吃上了一波节日红利。 你有没有注意到很多App在应用商店里改头换面,开展了很多以“三八节”为主题的营销活动,并且取得了不错的成绩。 可见季节性营销策划对产品的下载量和用户留存率还是很重要的。 那么我们如何…

16.【CPP】详解继承

继承方式 如图 注意点 1.基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它 2.基类private成员在派生类中是不能被访问&#x…

电力物联网采集终端

电力物联网采集终端,通过采集设备数据,并将其传输到云端,实现精细管理和优化。 一、工作原理 电力物联网采集终端主要数据采集模块、通信模块等组成。采集设备的各项数据,如温度、湿度、电流等;数据采集模块将采集到的数据进行处理并存储;通…

索尼ILME-FX3摄像机RSV文件无法播放的修复方法

索尼摄像机rsv文件修复案例处理了很多,rsv是索尼mp4或者mxf文件封装失败时生成的临时文件,一般是由于断电或者摄像机意外重启导致的,下边来看下遇到rsv文件无法播放时的修复方法。 故障文件: 29.56G/rsv文件 故障现象: 摄像机型号为索尼IL…

【大模型API调用初尝试一】智谱AI 通义千问

大模型API调用初尝试一 调用大模型API能干什么智谱AI大模型API调用的过程获取API_KEYGLM_4同步调用GLM_4异步调用文生图大模型API调用 阿里云通义千问API调用过程单轮会话多轮会话 调用大模型API能干什么 大模型的参数非常庞大,功能非常强大,但是训练成…

node:internal/crypto/hash:69 this[kHandle] = new _Hash(algorithm, xofLen);

npm 打包报错 原因就是npm版本太高了,用的18版本,切换成16版本就好了。

UI 学习 二 可访问性 模式

教程:Accessibility – Material Design 3 一 颜色对比 颜色和对比度可以用来帮助用户看到和理解应用程序的内容,与正确的元素交互,并理解操作。 颜色可以帮助传达情绪、语气和关键信息。可以选择主色、辅助色和强调色来支持可用性。元素之…

H5 流光分割个人主页源码

源码名称:流光分割个人主页源码 源码介绍:一款流光分割特效个人主页源码,源码带大量跳转个人联系方式按钮和朋友按钮。同时带有个人介绍。 需求环境:H5 下载地址: https://www.changyouzuhao.cn/10241.html

电机参数辨识算法(2)——基于高频注入的磁链辨识策略

电机参数辨识算法(1)——基于高频注入的电感辨识策略-CSDN博客https://blog.csdn.net/m0_46903653/article/details/136722750?spm1001.2014.3001.5501上一期已经讲过了电感辨识方法。 今天这是参数辨识的第二期,今天来简单看看磁链的辨识。…

【数学建模】熵权法

之前我们学了层次分析法和topsis法,但是主观性十分强,有没有科学的方法得出权重呢?今天,我们来学习熵权法! 基本概念: 熵权法,物理学名词,按照信息论基本原理的解释,信息…