@Value 读取环境变量配置

在项目开发过程中,有必要使用一些灰色规则(即仅用于开发使用过程中的逻辑控制变量)。
比如,本地开发中,一些业务逻辑需要调用第三方代码,但又在本地调不通,怎么办。只能通过 if(本地开发) {mock数据或直接不调用} else {实际三方接口调用}。
这种方式可以使用@Value注解读取环境变量的方式来实现。

@Value属于spring的注解,在spring-beans包下,可以在 字段 或 方法参数 或 构造函数参数 上使用,通常用于属性注入。支持SpEL (Spring Expression Language)表达式来注入值,同时也支持属性占位符注入值。

使用@Value前提:
不能直接作用于静态变量(static);
不能直接作用于常量(final);
不能在非注册的类中使用(类需要被注册在spring上下文中,如用@Service,@RestController,@Component等);
使用这个类时,只能通过依赖注入的方式,用new的方式是不会自动注入这些配置的

@Value("${spring.application.name:somnus}") 代表的是假如application当中读不到值,那么就使用somnus。这样可以完全避免没有设置值而启动报错的问题。当然也可以不设置默认值,比如@Value("${spring.application.name:}") 这样同样可以避免没有设置值启动报错的问题!

使用@Value(“${环境变量名}”)就可以直接读取到操作系统的环境变量,就算在properties或者yaml中指定同名属性值也会被系统环境变量值所覆盖,所以在平常自定义属性时避免与系统环境变量重名,最好加上前缀。

笔者定义了这个字段注解

@Value("${test.ptVerify:}")
private String pressureTestVerify;

但是又不想在 application.yaml中定义,想直接通过 环境变量注入。
这里的问题在于,这里的ptVerify是 驼峰命名[破涕为笑],又有点号

在k8s的configMap里,先定义了
test.ptVerify,发现不行(在控制台也查不到这个环境变量,应该是 环境变量里不允许有 点)
test_ptVerify 不行,spring不识别
test_pt_verify 不行

最后可以工作的为
TEST_PTVERIFY
即全大写形式

SpringBoot的解释如下:

Binding From Environment Variables
Most operating systems impose strict rules around the names that can be used for environment variables. For example, Linux shell variables can contain only letters (a to z or A to Z), numbers (0 to 9) or the underscore character (_). By convention, Unix shell variables will also have their names in UPPERCASE.Spring Boot’s relaxed binding rules are, as much as possible, designed to be compatible with these naming restrictions.To convert a property name in the canonical-form to an environment variable name you can follow these rules:Replace dots (.) with underscores (_).Remove any dashes (-).Convert to uppercase.For example, the configuration property spring.main.log-startup-info would be an environment variable named SPRING_MAIN_LOGSTARTUPINFO.

debug了下 代码,相应的处理逻辑在类SystemEnvironmentPropertySource

	protected final String resolvePropertyName(String name) {Assert.notNull(name, "Property name must not be null");String resolvedName = checkPropertyName(name);if (resolvedName != null) {return resolvedName;}String uppercasedName = name.toUpperCase();if (!name.equals(uppercasedName)) {resolvedName = checkPropertyName(uppercasedName);if (resolvedName != null) {return resolvedName;}}return name;}@Nullableprivate String checkPropertyName(String name) {// Check name as-isif (this.source.containsKey(name)) {return name;}// Check name with just dots replacedString noDotName = name.replace('.', '_');if (!name.equals(noDotName) && this.source.containsKey(noDotName)) {return noDotName;}// Check name with just hyphens replacedString noHyphenName = name.replace('-', '_');if (!name.equals(noHyphenName) && this.source.containsKey(noHyphenName)) {return noHyphenName;}// Check name with dots and hyphens replacedString noDotNoHyphenName = noDotName.replace('-', '_');if (!noDotName.equals(noDotNoHyphenName) && this.source.containsKey(noDotNoHyphenName)) {return noDotNoHyphenName;}// Give upreturn null;}

组件类,@Value必须在SpringBoot的组件中使用

@Component
public class ProfileValueInit {@Value("${spring.profiles.active:}")private String profile;@Value("${test.verify:}")private String verifyTest;@Value("${test.ptVerify:}")private String pressureTestVerify;@PostConstructpublic void init() {if (profile != null && profile.contains("local")) {ProfileUtils.MOCK_VALUE = true;}if ("true".equals(verifyTest)) {ProfileUtils.TEST_VERIFY = true;}if ("true".equals(pressureTestVerify)) {ProfileUtils.PRESSURE_TEST_VERIFY = true;}}
}

方法类

public class ProfileUtils {public static boolean MOCK_VALUE;public static boolean TEST_VERIFY;public static boolean PRESSURE_TEST_VERIFY;public static boolean isMockEnv() {return MOCK_VALUE;}public static boolean isTestVerify() {return TEST_VERIFY;}public static boolean isPressureTestVerify() {return PRESSURE_TEST_VERIFY;}
}

业务类

// 压测模拟
boolean pt = ProfileUtils.isPressureTestVerify();
if (pt) {//做模拟逻辑处理
}

使用set | grep PT查看环境变量,发现有环境变量TEST_PTVERIFY=true,那么以上代码则会生效。
在这里插入图片描述

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

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

相关文章

JavaScript基础知识1(引入方式、注释、输入输出、变量、数组)

JavaScript基础知识1(引入方式、注释、输入输出、变量、数组) javascript 引入方式内部方式外部形式 注释和结束符单行注释多行注释 结束符 输入和输出输出输入 alert(你好JS);document.write(js我来了);console.log(看看对不对);prompt(输入您的姓名&am…

cxgrid列内容居中

笑掉大牙,需要这个功能了,找遍了全网,没有一个可用的成功案例,唯一可用的就是表中添加字段,然后选择properties然后选择对齐方式,根本不实用,因为列都是动态生成的,不可能提前做好所…

【开源】渔具租赁系统 JAVA+Vue.js+SpringBoot+MySQL

目录 一、项目介绍 1.1渔具档案模块 1.2渔具租赁模块 1.3渔具归还模块 1.4在线留言模块 二、项目截图 三、核心代码 一、项目介绍 Vue.jsSpringBoot前后端分离新手入门项目《渔具租赁系统》,包括渔具档案模块、渔具租赁模块、渔具归还模块、在线留言模块和部…

当新媒体运营开始说真话,这些道理你真的懂么?沈阳新媒体运营培训

运营新人,尤其是刚毕业、啥都不会的大学生,一定要认清的现实就是:虽然新媒体运营这个岗位门槛比较低,薪资也比较香,但绝不是养老型的工作。 平时大家还是很忙的,所以一定要摒弃学生思维,千万别…

【数据分析】打造完美数据分析环境:Python开发环境搭建全攻略

打造完美数据分析环境:Python开发环境搭建全攻略 在数据分析的世界中,搭建一个稳定且高效的Python开发环境是至关重要的。本文将介绍三种主要的环境搭建方式:使用pip、Anaconda和Miniconda。 1. 使用pip从清华镜像安装Python包 pip是Pytho…

02--nginx代理缓存

前言:比较常用的用法反向代理,和缓存的一些操作,用虚拟环境复刻出来,里面参数不用详细记录,用作复习,使用时直接查找即可。环境搭建过程参考前一篇文章nginx基础。 1、基础环境 IP角色作用192.168.189.143…

编译安装gcc-11及可能遇到的bug

编译安装脚本 GCC_VERSION11.1.0 PACKAGE_DIR/path/to/gcc/source/code GCC_DIR$PACKAGE_DIR/gcc-$GCC_VERSION GCC_INSTALL_DIR/path/to/install/gccmkdir -p $GCC_INSTALL_DIR cd $GCC_INSTALL_DIR rm -rf * cd $PACKAGE_DIR rm -rf gcc-$GCC_VERSION if [ ! -f "gcc-$…

freertos初体验 - 在stm32上移植

1. 说明 freertos内核 非常精简,代码量也很少,官方也针对主流的编译器和内核准备好了移植文件,所以 freertos 的移植是非常简单的,很多工具(例如CubeMX)点点鼠标就可以生成一个 freertos 的工程&#xff0…

ubuntu18.04安装pycharm2024.1.2后,创建快捷方式图标

Ubuntu 18.04 安装 PyCharm并创建快捷方式_untuntu018.04 pycharm怎么创建快捷方式-CSDN博客

探秘Spring Bean之单例奥秘:源码深析与高级应用

1. 引言 在Spring框架中,Bean的作用域是控制Bean实例创建和管理的重要概念。深入理解Bean的作用域,尤其是单例作用域(Singleton),对于优化系统性能、提升线程安全性以及管理资源等方面具有至关重要的作用。本文将围绕…

AquaCrop农业水资源管理,模拟作物生长过程中水分的需求与消耗

AquaCrop是由世界粮食及农业组织(FAO)开发的一个先进模型,旨在研究和优化农作物的水分生产效率。这个模型在全球范围内被广泛应用于农业水管理,特别是在制定农作物灌溉计划和应对水资源限制方面显示出其强大的实用性。AquaCrop 不…

VR导航的实现原理、技术优势和应用场景

VR导航通过虚拟现实技术提供沉浸式环境,结合室内定位技术实现精准导航。目前,VR导航已在多个领域展现出其独特的价值和潜力,预示着智能导航系统的未来发展。 一、实现原理 VR导航技术依托于虚拟现实(VR)和室内定位系统。VR技术利用计算机模…

Python考试复习---day5

1.打印商品名 ainput().split() print("商品列表:") for i,name in enumerate(a):print("{}\t{}".format(i,name))enumerate----枚举--利用它可以同时获得索引和值 enumerate多用于在for循环中得到计数 例如: list1 ["这&qu…

算法刷题笔记 数组元素的目标和(C++实现)

文章目录 题目描述解题思路实现代码 题目描述 给定两个升序排序的有序数组A和B,以及一个目标值x。数组下标从0开始。请你求出满足A[i]B[j]x的数对 (i,j)。数据保证有唯一解。 输入格式 第一行包含三个整数n,m,x分别表示A的长度,B的长度以及目标值x。第…

Netty SSL双向验证

Netty SSL双向验证 1. 环境说明2. 生成证书2.1. 创建根证书 密钥证书2.2. 生成请求证书密钥2.3. 生成csr请求证书2.4. ca证书对server.csr、client.csr签发生成x509证书2.5. 请求证书PKCS#8编码2.6. 输出文件 3. Java代码3.1. Server端3.2. Client端3.3. 证书存放 4. 运行效果4…

Java 高级语法

语法&#xff1a;Arrays.asList(值1&#xff0c;值2&#xff0c;....) 作用&#xff1a;它可以把一个数组或者多个参数转换成一个 List 集合 代码演示&#xff1a; //创建一个List类型的集合&#xff0c;其值为Integer类型&#xff0c;集合包含1,2,3三个数值 List<Intege…

消费者组到底是什么?no.15

Kafka的消费者组。 消费者组&#xff0c;即Consumer Group&#xff0c;应该算是Kafka比较有亮点的设计了。那么何谓Consumer Group呢&#xff1f;用一句话概括就是&#xff1a;Consumer Group是Kafka提供的可扩展且具有容错性的消费者机制。既然是一个组&#xff0c;那么组内必…

JavaScript 贪心算法(Greedy Algo)

贪婪是一种算法范式&#xff0c;它逐步构建解决方案&#xff0c;始终选择提供最明显和直接收益的下一个部分。贪婪算法用于解决优化问题。 如果问题具有以下属性&#xff0c;则可以使用贪心法解决优化问题&#xff1a; 每一步&#xff0c;我们都可以做出当前看来最好的选择&…

python项目中的日志定义

python日志定义&#xff0c;包含配置文件&#xff0c;和日志实例创建方法 一、日志创建方法&#xff0c;创建一个loger实例 import loggingdef get_logger(name):# 创建一个loggerlogger logging.getLogger(name)# 设置日志级别logger.setLevel(logging.INFO)# 创建一个日志…

elasticsearch有什么用

Elasticsearch是一个开源的分布式搜索和分析引擎&#xff0c;它被广泛用于构建实时的、可扩展的搜索和分析应用程序。以下是Elasticsearch的主要用途和功能&#xff1a;12 全文搜索&#xff1a;Elasticsearch提供强大的全文搜索功能&#xff0c;可以处理大量的文本数据&…