Springboot读取配置文件的方式以及多环境读取的方式

news2024/11/15 11:05:47

Springboot读取配置文件的方式以及多环境读取的方式

  • 一.首先介绍一下读取配置文件中的值的方式
    • 1.@Value注解
    • 2.@ConfigurationProperties注解赋值
    • 3.使用 Environment 读取配置文件
  • 多环境读取

在项目中我们可能需要灵活的配置一些参数,就会将这些参数写到yaml文件或者properties文件中进行读取,这里记录一些灵活读取的方式

一.首先介绍一下读取配置文件中的值的方式

1.@Value注解

该注解可以将配置文件()中的值注入到类的成员变量中,
application.yml中写入如下配置

server:
  port: 8888
  servlet:
    context-path: /demo5

name: zhangSan
age: 12
@Data
@Component
public class Student {
    @Value("${name}")
    private String name;
    @Value("${age}")
    private Integer age;

}

这样就可以在项目启动时从environment对象中拿到该配置文件中的键值对进行赋值了,如果想赋值给静态变量需要将注解加在具体属性的set方法上!

2.@ConfigurationProperties注解赋值

@ConfigurationProperties注解用于将外部属性值绑定到一个类的属性上,通过属性名前缀匹配的方式将属性值映射到对应的属性上
application.yml中写入如下配置

server:
  port: 8888
  servlet:
    context-path: /demo5

sykmi:
  name: zhangSan
  age: 12
@Data
@Component
@ConfigurationProperties(prefix = "sykmi")
public class Student {

    private String name;

    private Integer age;

}

这里我使用该注解指定前缀为sykmi,用以读取配置文件中该前缀下的属性值并赋值,更省事了一些,并且添加@Component注解将其添加到容器中,使用@Configuration也是可以的,作用都是添加到容器中
另外,如果你不想从Springboot的配置文件中定义这些属性读取,你想自己定义properties文件以供读取也是可以的,但是需要指定属性源,也就是需要添加@PropertySource注解,以下是一个简单的例子(我已经删除了application.yml中的name和age),我创建了一个students.properties配置文件放在了resources目录下,这里我使用@PropertySource注解指定该配置文件的位置
在这里插入图片描述
接下来你需要在类中这样描述

@Data
@Component
@PropertySource("classpath:/students.properties")
@ConfigurationProperties(prefix = "exp")
public class Student {

    private String userName;

    private Integer age;

}

大功告成

3.使用 Environment 读取配置文件

这是我最不喜欢的一种方式,主要是不够明了,这个Environment类可以直接在项目中进行注入并且使用,它可以在项目启动时加载项目默认的配置文件和使用@PropertySource注解指定的配置文件并存储起来,可以使用getProperty方法进行读取值的操作。一般用法如下
在这里插入图片描述

@Configuration
@PropertySource("classpath:/students.properties")
public class GenBean {
	//这里可以直接使用,它已经加载了一些配置文件的键值对了
    @Resource
    private Environment environment;

    @Bean
    public Student genStudent(){
        Student student = new Student();
        student.setUserName(environment.getProperty("exp.username"));//直接从environment拿值
        student.setAge(environment.getProperty("exp.age",Integer.class));//直接从environment拿值
        return student;
    }

}

上面这样的还算规范的,有的不规范的直接在项目中导入Environment对象进行拿值,不仔细看根本不知道从哪个配置文件中读取的值。因为一旦你配置类中或者其他以@ConfigurationProperties指定配置文件动态注入的时候,Environment对象中会有很多配置文件的键值对,感觉不太好。

多环境读取

有时候我们在开发环境、测试环境和生产环境需要动态读取不同的值,但是每次换环境启动的时候再更改配置文件中的值太麻烦了,所以催生出这种根据环境的不同动态读取值的方式。
这里我以读取微信支付配置文件做参考,示例如下:
首先在Springboot的总配置文件(一般是application.yml)中自定义一个值用来控制环境的定义

# 支付环境
customer:
  payEnv: prod

然后在resources文件夹下建立config/payConfig/wxPay/…文件夹,我分别为三个环境建立了dev/test/prod文件夹,并且都存放了一份wxpay.properties配置文件,其中为了区分观察我加了一个wxpay.ceshi的属性,其他都是微信支付的属性
在这里插入图片描述
接下来创建实体类用以注入
在这里插入图片描述
大家可以看下图中的classpath路径,我这里指定路径的过程中使用了${customer.payEnv}(SPEL表达式),用于动态引用值,这个值在哪呢?还记得总配置文件中的自定义的值吗?是的,就是那个值,在项目启动的过程中会将该值解析进去从而形成一个路径!所以当我们在总配置文件中将该值填成dev/test/prod时,项目启动时就会分别加载成
classpath:config/payConfig/wxPay/dev/wxpay.properties
classpath:config/payConfig/wxPay/test/wxpay.properties
classpath:config/payConfig/wxPay/prod/wxpay.properties

了!
让我们看看效果吧!
dev时:
在这里插入图片描述
test时:
在这里插入图片描述
prod时:
在这里插入图片描述

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

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

相关文章

C++技能系列 ( 4 ) - 深入理解C++临时对象【解析与提高性能手段】

系列文章目录 C技能系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everything is for the future of dream w…

Ubuntu设置虚拟机共享目录/mnt/hgfs下无文件显示相关问题归纳

文章目录 问题一:/mnt目录下无hgfs文件夹问题二:/mnt/hgfs 文件夹为空 问题一:/mnt目录下无hgfs文件夹 问题背景: 在打开共享目录A的时候,突然改变共享目录,也就是从A改到了B,但是资源管理器还…

TiDB v7.1.0版本 相关(部署、在线扩容、数据迁移)测试

作者: tomxu 原文来源: https://tidb.net/blog/69083bca TiDB v7.1.0版本 相关(部署、在线扩容、数据迁移)测试 一、服务器信息参数 | 序号 | 服务器型号 | 主机名 | 配置 | | IP地址 | 用户名 | 密码 | | -- | --------- | …

chatgpt赋能python:Python怎么过滤异常值-降噪数据的利器

Python怎么过滤异常值 - 降噪数据的利器 什么是异常值 在数据分析和机器学习领域,我们常常需要对数据进行预处理,其中一个常见的问题就是异常值。也可以称为噪声数据或离群点,指数据集中与其他值相差较大的点。通常这些异常值出现的原因有很…

6.10 面向对象抽象

抽象类 1 概念 Java中可以定义被abstract关键字修饰的方法,这种方法只有声明,没有方法体,叫做抽象方法. Java中可以定义被abstract关键字修饰的类,被abstract关键字修饰的类叫做抽象类 如果一个类含有抽象方法,那么它一定是抽象类 抽象类中的方法实现交给子类来完成 2 抽象…

MsSqlServer配置管理器TCP/IP属性

TCP/IP 属性(“IP 地址”选项卡) 使用 “TCP/IP 属性(‘IP 地址’选项卡)” 对话框,可以配置特定 IP 地址的 TCP/IP 协议选项。 只有选中 “IP All” ,才能一次配置所有地址的 “TCP 动态端口” 和 “TCP…

Linux学习[16]bash学习深入2---别名设置alias---history指令---环境配置相关

文章目录 前言1. alias2. history3. 环境配置相关总结 前言 linux学习15里面简单提了一下alias指令,就表明它是一个别名的作用,这节就展开来写一下。 同时上一节一笔带过的history指令,这一节也进行例子的演示记录。 最后是环境相关的配置&a…

高斯过程(Gaussian Process)回归预测,例子,代码及可视化展示

高斯过程指的是一组随机变量的集合,这个集合里面的任意有限个随机变量都服从联合正态分布。(联合正态分布是指多个随机变量的联合分布满足正态分布。联合分布是指多个随机变量同时满足的概率分布,一个常见的例子是考虑两个随机变量&#xff1…

【2023年最新】提高分类模型指标的六大方案详解

文章目录 数据增强特征选择调整模型参数模型集成迁移学习模型解释完结 当今,机器学习模型得到了广泛的应用,其中分类模型是其中最常见和重要的一种。在实际应用中,如何提高分类模型的指标,使其在不同场景下表现更佳并且具有更好的…

【Web网页制作】影视主题网页制作web页面开发(附源码)

【写在前面】 其实之前我就写过一篇关于我的家乡的页面,也有不少网友和我私下反馈,让我多出一些关于页面制作的,于是乎我就今天晚上抽出点时间来整理一篇关于影视内容的web页面制作,希望能够得到大家的喜欢。 【涉及内容】 web网页…

什么是进程?程序又是什么?程序运行在操作系统来看是怎么做的?

相信很多人都看到过课本上写的进程的概念,那么真的理解了吗? 课本上是这样讲的,课本概念:程序的一个执行实例,正在执行的程序等。 那么进程到底是什么?我先把内核层面上的概念拿出来:内核观点&a…

【算法基础】基础算法

快速排序 模板题:785. 快速排序 - AcWing题库 思路: 定义一个x(一般喜欢用中间的),我们快速排序,让x左边的都比它小,同时让右边的都比它大。然后像二分一样不断细分,缩小范围进行同…

flink主要组件及高可用配置

背景 flink不论运行在哪种环境,例如Yarn,Mesos,Kebernute以及独立集群,每个应用都会包含重要的几个组件,本文就来讲述下flink的主要组件以及如何实现flink的高可用配置 flink主要组件 如图所示,flink主要…

TiDB 7.1 资源管控特性试用

作者: 啦啦啦啦啦 原文来源: https://tidb.net/blog/3ddb423a 一.背景 印象里 2022 年初的时候就有小伙伴在 asktug 提出 TiDB 未来是否会有多租户功能的问题了,没想到这么快就已经 GA 了。资源管控特性(Resource Control&…

【论文阅读】Weighted Boxes Fusion(WBF)模型融合原理解读

论文地址:https://arxiv.org/pdf/1910.13302.pdf 代码地址:GitHub - ZFTurbo/Weighted-Boxes-Fusion: Set of methods to ensemble boxes from different object detection models, including implementation of "Weighted boxes fusion (WBF)"…

chatgpt赋能python:Python中如何转化大小写

Python中如何转化大小写 在Python编程中,转化字符串的大小写是一个常见的操作。Python提供了内置函数和字符串方法来实现此操作。本文将介绍如何使用Python中的这些函数和方法来转换字符串的大小写。 使用内置函数str.upper()和str.lower() str.upper()函数将字符…

共创开源生态 | 小米肖翔荣获“2023中国开源优秀人物”奖

6月15-16日,以“开源创新 数字化转型 智能化重构”为主题的“第十八届开源中国・开源世界高峰论坛”在北京成功召开。小米工程师肖翔凭借其在 Apache 基金会的开源贡献及在操作系统领域内的技术突破,荣获“2023中国开源优秀人物”奖。 Xiaomi …

一文读懂候选边界框Selective Search、AnchorBased、Anchor Free

目标检测是计算机视觉中的一项重要任务,主要目的是在图像或视频中识别并定位感兴趣的对象。为了实现这一目标,目标检测算法通常会生成一系列候选边界框,这些框包围了图像中可能存在的目标对象。候选边界框技术对于减少目标检测的计算复杂度和…

Vue中的数据可视化词云展示与词云生成

Vue中的数据可视化词云展示与词云生成 数据可视化是现代Web应用程序中的一个重要组成部分,它使得数据更加易于理解和分析。词云是一种非常流行的数据可视化形式,它可以用来展示文本数据中的主题和关键字。在本文中,我们将介绍如何在Vue中使用…

chatgpt赋能python:Python怎么转化数据类型?

Python怎么转化数据类型? Python是一种高级编程语言,它已经成为了许多程序员的首选语言。在Python中,数据类型是非常重要的一部分。但是,当我们需要将数据从一种类型转换为另一种类型时,该怎么做呢?在本文…