实战中使用的策略模式,使用@ConditionalOnProperty实现根据环境注册不同的bean

news/2024/10/22 10:58:32/

 场景复现

举个例子,针对不同的设备的内存的不同加载一些资源的时候需要采取不同的策略,比如,在内存比较大的设备,可以一次性加载,繁殖需要使用懒加载,这个时候我们就可以采用配置文件+配置中心去控制了

 @ConditionalOnProperty

@ConditionalOnProperty是Spring Boot中的一个注解,它可以用来控制某个Bean的创建和激活。它的作用是通过读取配置文件中的属性值来决定是否创建或激活某个Bean。当配置文件中的属性值与@ConditionalOnProperty的要求相符时,才会创建或激活该Bean。

@ConditionalOnProperty有以下几个参数:

  • name:要检查的属性的名称;
  • havingValue:要检查的属性的值;
  • matchIfMissing:如果配置文件中没有该属性,是否匹配。

 代码

策略类的父接口

public interface LoadModelStrategy {void loadModel(List<Speaker> speakers);
}

策略类抽象类

public abstract class AbstractLoadModelStrategy implements LoadModelStrategy{public static boolean checkFileExist(String filePath) {return new File(filePath).exists();}
}

实现类

@Slf4j
public class LazyLoadModelStrategy extends AbstractLoadModelStrategy{@Overridepublic void loadModel(List<Speaker> speakers) {log.info("懒加载");}
}
@Slf4j
public class PreloadedLoadModelStrategy extends AbstractLoadModelStrategy {@Overridepublic void loadModel(List<Speaker> speakers) {log.info("立即加载");}
}

配置类

@Configuration
public class LoadModelConfig {@Bean@ConditionalOnProperty(name = "test.strategy",havingValue = "lazy")public LoadModelStrategy lazyLoadModelStrategy(){return new LazyLoadModelStrategy();}@Bean@ConditionalOnProperty(name = "test.strategy",havingValue = "preloaded")public LoadModelStrategy preloadedLoadModelStrategy(){return new PreloadedLoadModelStrategy();}
}

配置文件

test:strategy: preloaded

消费者 

@Slf4j
@Component
@ConfigurationProperties(prefix = "test")
public class InitConfig implements CommandLineRunner {@Resourceprivate LoadModelStrategy loadModelStrategy;// 执行初始化逻辑@Overridepublic void run(String... args) throws Exception {log.info("进入初始化方法");log.info("loadModelStrategy:{}", loadModelStrategy);}
}

效果展示

立即加载

懒加载 


http://www.ppmy.cn/news/1259756.html

相关文章

吴恩达《机器学习》11-1-11-2:首先要做什么、误差分析

一、首先要做什么 选择特征向量的关键决策 以垃圾邮件分类器算法为例&#xff0c;首先需要决定如何选择和表达特征向量 &#x1d465;。视频提到的一个示例是构建一个由 100 个最常出现在垃圾邮件中的词构成的列表&#xff0c;根据这些词是否在邮件中出现来创建特征向量&…

科技论文中的Assumption、Remark、Property、Lemma、Theorem、Proof含义

一、背景 学控制、数学、自动化专业的学生在阅读论文时&#xff0c;经常会看到Assumption、Remark、Property、Lemma、Theorem、Proof等单词&#xff0c;对于初学者可能不太清楚他们之间的区别&#xff0c;因此这里做一下详细的说明。 以机器人领域的论文为例。 论文题目&…

【从0配置JAVA项目相关环境1】jdk + VSCode运行java + mysql + Navicat + 数据库本地化 + 启动java项目

从0配置JAVA项目相关环境 写在最前面一、安装Java的jdk环境1. 下载jdk2. 配置jdk3. 配置环境变量 二、在vscode中配置java运行环境1. 下载VSCode2. 下载并运行「Java Extension Pack」 三、安装mysql1.官网下载MySQL2.开始安装如果没有跳过安装成功 3.配置MySQL Server4.环境变…

STM32串口接收数据包(自定义帧头帧尾)

1、基本概述 本实验基于stm32c8t6单片机&#xff0c;串口作为基础且重要的外设&#xff0c;具有广泛的应用。本文主要理解串口数据包的发送与接收是如何实现的&#xff0c;重要的是理解程序的实现思路。 2、关键程序 定义好需要用到的变量&#xff1a; uint8_t rxd_buf[4];//…

1.1 计算机和编程语言

计算机与编程语言的用处 计算机与大家的生活息息相关&#xff0c;例如银行的ATM机就是计算机、日常使用的手机等。大家大部分情况都是使用现有的软件&#xff0c;只有在特定场景、特定需求的环境下才会编写软件 课程目的 计算机是怎么工作的计算机擅长干什么&#xff0c;计算…

[传智杯 #4 初赛] 萝卜数据库

题目描述 花栗鼠很喜欢偷吃生产队的大萝卜&#xff0c;因此花栗鼠科技大学正在研究一种新型的数据库&#xff0c;叫做萝卜数据库。 具体来说&#xff0c;它支持 k(1≤k≤100) 个字段&#xff0c;每个字段名都是整数&#xff0c;里面存储的数值也都是整数。 现在你支持如下操…

*p++和(*p)++的区别

*p和(*p)的区别 *和是同优先级操作符&#xff0c;且都是从右至左结合的 ∗ * ∗p&#xff1a;取p所指单元的值&#xff0c;p指向下一单元&#xff0c;即p自加1&#xff0c;然后p指向下一个地址。和 (p)意思一样 (*p)&#xff1a;()的优先级比和都高&#xff0c;所以作用在()内…

IOday4作业

使用两个子进程完成两个文件的拷贝&#xff0c;子进程1拷贝前一半内容&#xff0c;子进程2拷贝后一半内容&#xff0c;父进程用于回收两个子进程的资源 #include<myhead.h>int main(int argc, const char *argv[]) {int pid-1;int fd -1;int fa -1;int fb -1;//求出文…