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

 场景复现

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

 @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.hqwc.cn/news/229117.html

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

相关文章

数据结构与算法编程题33

统计二叉树中双分支结点(度为2的结点)个数 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std;typedef char ElemType; #define ERROR 0 #define OK 1 #define Maxsize 100 #define STR_SIZE 1024typedef struct BiTNode {ElemType data;BiTNode*…

【Java】使用 IDEA 快速生成 SpringBoot 模块

项目目录下新建 module 模块 在 pom.xml 更改为 spring initializr 配置之后的 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchem…

面试题:说一下你对 OAuth2 协议原理的理解?

文章目录 OAuth2简介角色流程客服端注册Client Type四种授权模式授权码模式隐藏式密码式凭证式RefreshToken OAuth2简介 OAuth 是一个开放授权协议标准&#xff0c;允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息&#xff0c;而不需要将用户名和密码提供给第三…

HarmonyOS 传感器开发指南

HarmonyOS 系统传感器是应用访问底层硬件传感器的一种设备抽象概念。开发者根据传感器提供的Sensor接口&#xff0c;可以查询设备上的传感器&#xff0c;订阅传感器数据&#xff0c;并根据传感器数据定制相应的算法开发各类应用&#xff0c;比如指南针、运动健康、游戏等。 运作…

vue找依赖包的网址

https://www.npmjs.com/ 浅收藏一下

内衣洗衣机和手洗哪个干净?小型洗衣机质量排名

这两年内衣洗衣机可以称得上较火的小电器&#xff0c;小小的身躯却有大大的能力&#xff0c;一键可以同时启动洗、漂、脱三种全自动为一体化功能&#xff0c;在多功能和性能的提升上&#xff0c;还可以解放我们双手的同时将衣物给清洗干净&#xff0c;让越来越多小伙伴选择一款…

Java零基础——docker篇

1.【熟悉】docker简介 1.1 什么是docker Docker是一个开源项目&#xff0c;诞生于2013年初&#xff0c;最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。项目后来加入了Linux基金会&#xff0c;遵从了Apache2.0协议&#xff0c;项目代码在GitHub上进…

大数据——一文详解数据仓库概念(数据仓库的分层概念和维度建模详解)

1、ods是什么&#xff1f; ods层最好理解&#xff0c;基本上就是数据从源表拉过来&#xff0c;进行etl&#xff0c;比如MySQL映射到Hive&#xff0c;那么到了Hive里面就是ods层。ods全称是 Operational Data Store&#xff0c;操作数据存储——“面向主题的”&#xff0c;数据…

使用Tensorboard可视化 遇到无法访问此网站

问题&#xff1a; 使用Tensorboard可视化 遇到无法访问此网站 解决方法&#xff1a;后面加上服务器ip[参考] tensorboard --logdir目标目录 --hostxxx.xxx.xxx.xx

Unity针对XBOX,SWITCH,PS5手柄的适配踩坑

前言&#xff1a; 记录一点最近在做手柄适配问题的踩坑。 这里推荐一款Unity做手柄适配的插件->Rewired Rewired官方文档链接Rewired Documentation | Supported Controllers Rewired插件里面有个是Player类&#xff0c;这个类获取到当前玩家的输入设备&#xff0c;输入…

一种方便、优美的使用Python调用fofa API的方法

免责声明&#xff1a;由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c; 文章作者不为此承担任何责任。 学习网络安全的过程中&#xff0c;绕不开fofa搜索&#xff0c;我的需求是使用fofa获取互联网所…

brk和sbrk

在计算机程序中&#xff0c;“program break”通常指的是堆的当前内存边界。当我们改变堆的大小&#xff08;即分配或释放内存&#xff09;&#xff0c;其实就是在命令内核改变进程的“program break”位置。 最初&#xff0c;“program break”正好位于未初始化数据段(bss)末…