springboot 项目获取 yaml/yml (或 properties)配置文件信息

news2024/11/25 13:46:42

文章目录

  • springboot 项目获取配置文件信息
    • 前言
    • 1、 @Autowired 注入 Environment类
    • 2、基础用法,使用@Value注解直接注入配置信息
    • 3、进阶方法(推荐使用)
    • 拓展:springboot 集成配置中心 - 以 Apollo 为例

springboot 项目获取配置文件信息

前言

在分布式项目开发中,通常会使用配置中心(例如:Apollo 配置中心)将配置文件和项目解耦。为了更具灵活性,有时候需要把一些数据放在配置文件中获取,能够减少很多麻烦,这个时候就需要读取配置文件信息。本文结合实际开发介绍几种使用过的读取配置文件的方法。

首先在配置文件中配置一条数据:

spring.application.name = user-service

1、 @Autowired 注入 Environment类

和项目中注入 service 或者 mapper 一样,声明一个 Environment 类变量,加上 @Autowire 注解。如下:

    @Autowired
    private Environment environment;

该类所属包:

	import org.springframework.core.env.Environment;

代码获取配置:

String applicationName = environment.getProperty("spring.application.name");

注意:key一定要写完整,有几层就写几层,每层的名字用点分隔。

但是,使用该方法具有一定的局限性。

局限性1:使用在静态方法中
如果要在静态方法中读取配置信息,不能简单的将 Environment 定义成 static 就完了,由于注入机制,注入一个静态的 bean 只会得到一个空的 bean,即变量的值为 null,一旦使用该 bean 对象就会报空指针异常。

错误使用方法:

    @Autowired
    private static Environment environment;//只定义成静态变量,environment 只会是null
	public static void m1(){
		// 一旦使用environment变量就会报空指针异常
		String applicationName = environment.getProperty("spring.application.name");	
	}

正确使用方法:

  1. 将 Environment 定义成 static 静态变量
  2. 加上 environment 的 getter/setter 方法
  3. 将@Autowire注解加到set方法上

需要注意的是,只需要 get 方法是静态的即可,set 方法不要静态,否则得到的 environment 还是null。

正确代码如下:

	private static Environment environment;

    @Autowired
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }

    public static Environment getEnvironment() {
        return environment;
    }

局限性2:无法直接读取自定义的Yml配置文件
Environment 无法直接读取自定义的配置文件,需要通过增加一个配置类,将自定义的配置文件暴露到spring environment 中。

解决方法:
定义一个配置类,将自定义的配置文件内容加载到 Environment 中,代码如下:

import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;

/**
 * 配置类
 * @Description 读取自定义Yml格式配置文件
 */
@Component
public class JdbcConfig {
    @Bean
    public PropertySourcesPlaceholderConfigurer getSqlConfigurer() {
        PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
        YamlPropertiesFactoryBean sqlConfigBean = new YamlPropertiesFactoryBean();
        sqlConfigBean.setResources(new ClassPathResource("jdbc-properties.yml"));
        configurer.setProperties(sqlConfigBean.getObject());
        return configurer;
    }
}

写好配置类,就可以通过注解 @Autowired 注入 Environment 类来读取自定义配置信息了。

2、基础用法,使用@Value注解直接注入配置信息

使用方式:

@Value(“${xxx.xxx.xxx})

代码如下:

    @Value("${spring.application.name}")
    private String applicationName;

注意:该方法也具有上述局限性。

3、进阶方法(推荐使用)

定义一个工具类,使用 @Component 注解使其成为配置类,继承ApplicationRunner 重写run()方法,再注入 Environment 获取配置,这样当项目启动好之后,配置的信息就已经加载完毕,可以做到在任何地方随时随地获取配置信息。

代码如下:

配置类:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

@Component
public class BaseConfig implements ApplicationRunner {

    @Autowired
    private Environment  environment;

    public static String applicationName;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        applicationName = environment.getProperty("spring.application.name");

    }
}

使用:直接用调用工具类的静态属性即可获取配置信息。

    @PostMapping(value = "/test/config")
    public List<String> testConfig() {
        List<String> list = new ArrayList<String>();
        list.add(BaseConfig.applicationName);
        return list;
    }

postman 测试结果:
在这里插入图片描述

拓展:springboot 集成配置中心 - 以 Apollo 为例

微服务中会使用配置中心管理配置文件信息,springBoot 通常会和这些配置中心集成提供一些方法获取配置信息,本文以 Apollo 配置中心为例展示如何获取配置信息。

(1)添加依赖

<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>red-apollo-client</artifactId>
</dependency>

(2)代码使用

Config config = ConfigService.getAppConfig();// 连接到 ConfigService 的 DEV/SIT/UAT/PROD 等环境
String applicationName = config.getProperty("spring.application.name", ""); // 获取配置信息

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

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

相关文章

YOLO配合 PYQT做自定义虚拟电子围-自定义绘制多边形虚拟电子围栏

电子围栏标注以及显示 1、目标检测&#xff1a; YOLO可以识别检测物体&#xff0c;这是众所周知的。使用YOLO来做目标检测&#xff0c;并获取坐标信息。 2、电子围栏 比如在监控中&#xff0c;指定一块区域&#xff0c;如果有目标进入&#xff0c;则发出警报&#xff0c;并提…

写的一致性问题之失效模式

文章目录 1、先删除redis缓存&#xff0c;再写入mysql&#xff1a;1.1、高并发情况下分析出现的问题 1、先删除redis缓存&#xff0c;再写入mysql&#xff1a; 此时删除redis成功&#xff0c;写入mysql成功&#xff0c;此时redis是空&#xff0c;mysql是新数据。此时删除redis…

财富通公司开发洗车小程序有哪些用处?

洗车小程序具有多种用处&#xff0c;主要体现在以下几个方面&#xff1a; 1.便捷预约服务&#xff1a;用户可以通过洗车小程序轻松预约洗车服务&#xff0c;无需亲自前往洗车店或打电话预约&#xff0c;节省了时间和精力。同时&#xff0c;小程序通常提供多种预约时间选项&…

Java进阶13讲__补充1/2

单元测试、反射、注解、Lombok 1. 单元测试 1.1 Junit单元测试框架 1.2 Junit框架入门 package com.itheima.a_单元测试;import org.junit.Test;public class SpringUtilTest {Testpublic void testPrintNumber() {StringUtil.printNumber("Jack");StringUtil.pri…

go 笔记

数据结构与 方法&#xff08;增删改查&#xff09; 安装goland,注意版本是2024.1.1&#xff0c;不是2024.2.1&#xff0c;软件下载地址也在链接中提供了 ‘go’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 在 Windows 搜索栏中输入“环境变量”&#…

Windows上安装RabbitMQ

rabbitmq是干嘛的我就不介绍了&#xff0c;直接开始安装教程。 搭建成功演示图 下载安装包 https://pan.baidu.com/s/1ZlCFxh9Q00ynSU3ZCpTC9Q?pwdry51​pan.baidu.com/s/1ZlCFxh9Q00ynSU3ZCpTC9Q?pwdry51 下载完后有两个包(erlang和rabbitmq) 先安装otp_win64_24.1.7.exe…

【Python系列】理解 Python 中的时间和日期处理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

测试开发基础——测试分类

四、测试分类 1. 按照测试目标分类 1.1. 界面测试 肉眼看到的任何元素都需要进行测试 界面测试&#xff08;简称U测试&#xff09;&#xff0c;指按照界面的需求&#xff08;一般是U设计稿&#xff09;和界面的设计规则&#xff0c;对我们软件界面所展示的全部内容进行测试…

【计算机网络】UDP 协议详解及其网络编程应用

文章目录 一、引言二、UDP1、UDP的协议格式2、UDP 报文的解包和分用3、UDP面向数据报的特点 三、UDP输入输出四、UDP网络编程 一、引言 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种网络通信协议&#xff0c;它属于传输层的协议。是一…

火语言RPA流程组件介绍--鼠标拖拽元素

&#x1f6a9;【组件功能】&#xff1a;在开始位置上按下鼠标&#xff0c;拖动到结束坐标或指定元素上放下鼠标&#xff0c;实现目标元素的拖拽 配置预览 配置说明 丨拖动元素 支持T或# 默认FLOW输入项 开始拖动的元素,并从当前元素开始按下鼠标 丨拖动到 目标元素/目标位…

vue3 el-message组件封装

背景 在封装请求拦截器时,使用ElMessage进行弹窗提示成功或失败,但是如果页面用到多个接口,这时就会导致页面出现很多弹窗,导致用户体验不好,有可能出现卡顿现象。 这时就需要进行一些判断,如果前面的ElMessage还没关闭并且类型是一致的就return,不再弹窗提示,类型不…

项目日志——日志器模块一部缓冲区的设计、实现、测试

文章目录 异步缓冲区模块模块设计缓冲区设计单个缓冲区 实现测试 异步缓冲区模块 模块设计 异步日志器的思想是为了避免业务线程因为写日志的过程时间较长而长时间阻塞 异步日志器的工作就是把业务输出的日志内容放入内存缓冲区中&#xff0c;使用专门的线程进行日志写入 这…

一款高效、简洁的帧动画生成工具

在现代网页设计和移动应用开发中&#xff0c;帧动画是一种常见的动画实现方式&#xff0c;它通过连续显示一系列静态图片来模拟动画效果。然而&#xff0c;手动创建和管理这些帧动画图片不仅耗时费力&#xff0c;而且效率低下。为此&#xff0c;gka 应运而生&#xff0c;它是一…

翻车率这么高!今年11月软考论文应该如何备考?

随着最近2024年5月软考成绩的出炉&#xff0c;大家发现论文及格绝大多数都是45分&#xff0c;有许多高级考生三科中只有论文不合格&#xff0c;与软考证书失之交臂。而下半年除高项&#xff0c;其他4个高级科目都将开考&#xff0c;那么高级中至关重要的论文科目该如何备考呢&a…

AI应用开发平台Dify本地Ubuntu环境部署结合内网穿透远程管理大模型

文章目录 前言1. Docker部署Dify2. 本地访问Dify3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 本文主要介绍如何在Linux Ubuntu系统使用Docker快速部署大语言模型应用开发平台Dify,并结合cpolar内网穿透工具实现公网环境远程访问…

微信小程序:wx.login或调用uni.login时报错the code is a mock one

微信小程序&#xff0c;调用wx.login或调用uni.login方法&#xff0c;返回the code is a mock one 原因与解决 原因:没有关联真实的 appid&#xff0c;解决办法&#xff1a;绑定真实的微信小程序的appid

OpenCV结构分析与形状描述符(9)检测轮廓相对于其凸包的凹陷缺陷函数convexityDefects()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 查找一个轮廓的凸性缺陷。 下图显示了一个手部轮廓的凸性缺陷&#xff1a; convexityDefects 是 OpenCV 库中的一个函数&#xff0c;用于检测轮…

文件压缩项目(基于Huffman编码)

目录 文件压缩压缩本质huffman树huffman树的构建Huffman编码的压缩过程获取Huffman编码构建压缩信息 Huffman编码的解压缩过程解压压缩的数据 写压缩函数的注意事项文件指针移动到头 测试过程对文本文件进行压缩纯英文文本测试中文文本测试中英文文本测试 对图片进行压缩解压缩…

第 1 课 编程是一门技术 ——认识Dev-C++

1.什么是编程&#xff1f; 软件由程序和文档组成&#xff0c;每个程序都是由一条条计算机能够识别和执行的指令组成的&#xff0c;每一天指令指挥计算机完成指定的操作。编写程序又称编程&#xff0c;他是一门技术。通俗地讲&#xff0c;编程就是告诉计算机&#xff0c;你要帮我…

合成控制法SCM

研究D的处理效应&#xff0c;找一个相似的样本&#xff0c;他们的差异就是处理效应。但&#xff1a;难点就在如何找到相似的样本。那么就通过合成法来合成一个虚拟的重庆。 案例&#xff1a;美国加州香烟法案出台 依靠权重来合成一个新的y 假设我们不用SCM&#xff0c;直接靠着…