Spring Boot读取配置文件内容的三种方式

news2024/9/26 5:18:59

系列文章目录

Spring Boot[概述、功能、快速入门]_心态还需努力呀的博客-CSDN博客

该系列文章持续更新中~


目录

系列文章目录

前言

一、@Value

二、Environment

2.1 注入对象

 2.2 调用获取属性的方法

 2.3 上述两种方法对比

三、@ConfigurationProperties

3.1 创建一个实体类

3.2 解决警告问题

 3.3 修改@ConfigurationProperties

 3.4 编写测试代码

总结


前言

Spring Boot中在yaml中编写的自定义变量、数组、对象等,在代码中读取该yaml配置文件中内容的三种方式。实现在代码中运用配置文件(yaml)中自定义的值。yaml的基本语法格式我不知道该怎么总结,很简单,学完我的唯一感受就是记得冒号后面加空格、加空格、加空格。。。所以这里直接将读取配置文件内容的三种方式。不清楚yaml语法格式的可以先去了解一下。


在开始获取前,首先在resources下配置aplication.yaml文件,在yaml文件内编写自定义的变量、数组、对象。已用来展示获取的内容值。代码如下:

name: 心态还需努力呀

#对象
person:
  name: lisi
  age: 20

#数组
address:
  - shanghai
  - beijing

一、@Value

在Controller类下给属性分别以@Value注解的方式分别赋值,@Value里的${yaml变量名}。

获取对象就对象.变量名。

获取数组就是使用索引的方式数组[0],在这里表示数组中的第一个值(上海)。

具体代码如下:

package com.imust.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @Value("${name}")
    private String name;
//    获取对象
    @Value("${person.name}")
    private String person_name;

    @Value("${person.age}")
    private int person_age;

//    获取数组
    @Value("${address[0]}")
    private String address1;

    @Value("${address[1]}")
    private String address2;

    @RequestMapping("/hello")
    public String hello(){
        System.out.println(name);
        System.out.println(person_name);
        System.out.println(person_age);
        System.out.println(address1);
        System.out.println(address2);
        System.out.println("========================");
        return "Hello,Spring Boot!";
    }
}

 运行http://localhost:8080/hello。控制台打印效果图如下:

 

二、Environment

2.1 注入对象

注入对象需要用到Autowired注解

@Autowired
    private Environment env;

 2.2 调用获取属性的方法

方法内传入参数与上面@Value里的参数一样,都是与yaml文件配置里面自定义的一致。

System.out.println(env.getProperty("name"));
System.out.println(env.getProperty("person.name"));
System.out.println(env.getProperty("person.age"));
System.out.println(env.getProperty("address[0]"));

 运行后http://localhost:8080/hello。控制台打印效果图如下:

 2.3 上述两种方法对比

首先第一种@Value方法便于理解,用起来也很简单,就是属性多了后会出现大量的@Value给属性赋值,代码不够精简。

第二种就解决了这一麻烦,只需要注入Environment对象后,直接使用getProperty方法里写入要读入的值的key就可获取到。代码会很精简。

三、@ConfigurationProperties

3.1 创建一个实体类

这里以获取配置文件中的person对象值为例。所以名字叫Person。在上方添加@ConfigurationProperties注解。

代码如下:

package com.imust.pojo;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties
public class Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

3.2 解决警告问题

当加上@ConfigurationProperties注解后会出现下图所示的内容: 

点击上图箭头所指的地方,进入网页后将依赖赋值放到自己的pom.xml文件的放依赖的地方。

 

 导入依赖下载完成后上述的警告就会消失。

 3.3 修改@ConfigurationProperties

因为我们有2个name的值,如果不加参数获取默认是取高层级下的值,age就不会被取出来。

所以我们要加上perfix=“person”,用来指定该类下的属性是指的person对象下的值。

@ConfigurationProperties(prefix = "person")

 3.4 编写测试代码

在Controller注入Person

@Autowired
    private Person person;

打印person查看效果 

System.out.println(person.toString());

查看控制台输出的结果,可看到读取配置文件内容成功。

 


总结

读取配置文件的内容的三种方法就已经演示完成,在大多数属性少的情况下还是用@Value的方法最为简便。精简的话还是第二种注入对象的方式使代码看起来更加美观。理解起来不太容易。第三种是在特殊的情况下比较常用的读取配置文件的内容可以封装为对象。第一种是必须会的,二三种可以简单理解,用到时可以参考资料也会很快的想起来并且快速的运用。

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

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

相关文章

前端工程师leetcode算法面试必备-简单的二叉树

一、前言 本难度的题目主要考察二叉树的基本概念和操作。 1、基本概念 树是计算机科学中经常用到的一种非线性数据结构,以分层的形式存储数据。二叉树是一种特殊的树结构,每个节点最多有两个子树,通常子树被称作“左子树”和“右子树”。 …

在结构异质的云杉林中使用机载激光扫描仪数据进行单树分割

论文题目:Single Tree Segmentation Using Airborne Laser Scanner Data in a Structurally Heterogeneous Spruce Forest Abstract 在这项研究中,我们提出了一种基于机载激光扫描的树冠表面模型 (CSM) 及其相应点云的单树分割和表征的新方法。该方法包…

AI算法工程师 | 09机器学习-概率图模型(一)概率图模型概述

目录机器学习 - 概率图模型 之 概率图模型概述1、概率图模型学习的意义2、有向图和无向图3、生成式模型与判别式模型机器学习 - 概率图模型 之 概率图模型概述 本阶段将开启 概率图模型系列 的旅程。 1、概率图模型学习的意义 从自然语言处理 NLP 的角度看: 在自…

前端性能优化(四):资源优化

目录 一:资源的压缩与合并 1.1.为什么要压缩&合并 1.2.HTML压缩: 1.3.CSS压缩: 1.4.JS 压缩与混淆: 1.5.CSS JS 文件合并: 二:图片格式优化 2.1.JPEG/JPG: 2.2.PNG: 2…

linux之终端里sqlite数据库的使用

一. linux下安装数据库和创建一个数据库 1.安装命令: (1)sudo apt-get install sqlite (2) sudo apt-get install libsqlite3-dev 2.安装完后,创建一个数据库,终端下输入命令 【sqlite3 数据库名字 】数据库名字以.db 结尾格式 创建数据库student.db 【 …

node.js--vm沙箱逃逸初探

前言 前几天遇到一个考察vm沙箱逃逸的题目,由于这个点是第一次听说,所以就花时间了解了解什么是沙箱逃逸。此篇文章是对于自己初学vm沙箱逃逸的学习记录,若记录知识有误,欢迎师傅们指正。 什么是沙箱 就只针对于node.js而言&am…

有关于huggingface tokenizer的text_pair

tokenizer有一个名为text pair的参数,这个参数在做NLI任务的时候很有用,因为输入不是一个single sentence,而是sentence pair。 但是这个参数的类型让人非常confused,而且同时还有一个text参数,让人不知道传入的sente…

Java-集合(2)

List集合 List接口是Collection接口的子接口 List集合类的元素是有序的(添加顺序和取出顺序是一致的)且可重复List集合类的每个元素都有对应的索引(和数组索引是一样的) List集合的常用方法 add(int index Object ele):在index索引位置插…

软件供应链安全中:攻击面远超想象

| 软件供应链攻击3年飙升742% | 引人注目的软件供应链攻击正在上升。欧盟网络安全机构ENISA报告称,自2020年初以来,有组织的软件供应链攻击数量增加了4倍。Gartner认为,这一趋势将持续下去。在《软件工程领导者如何降低软件供应链安全风险》…

dubbo学习笔记1(小d课堂)

常见的dubbo项目分层: 搭建springbootdubbo环境 我们首先用idea创建一个maven项目: 我们把src删除,在里面创建module: 然后接下来我们就要去用springboot去整合dubbo。 我们可以去github上去搜索dubbo,会找到dubbo-s…

心理应激微反应刑事侦查应用,社交行为、情绪行为、生物行为,说谎掩饰,单向表达不分析,情绪反应管理机制,惊讶,厌恶,愤怒,恐惧,悲伤,愉悦

心理应激微反应刑事侦查应用,社交行为、情绪行为、生物行为,说谎掩饰,单向表达不分析,情绪反应管理机制,惊讶,厌恶,愤怒,恐惧,悲伤,愉悦 提示:系列…

【uni-app学习之日历组件】(calendar 底部可展开 折叠)

链接 效果图 代码块 <template><tmt-calendar defaultDate"2021-11-03" :point-list"[2022-03-20,2022-04-01,2022-04-02,2022-04-05]" :show"true" changeDate"changeDate"></tmt-calendar> </template>参…

【王道操作系统】4.1.1 初识文件管理概念和功能

初识文件管理概念和功能 文章目录初识文件管理概念和功能1.文件的属性2.文件内部的数据如何组织起来3.文件之间应该如何组织起来4.操作系统应该向上提供哪些功能5.从上往下看&#xff0c;文件应该如何存放在外存6.其他需要由操作系统实现的文件管理功能1.文件的属性 2.文件内部…

STM32——TIM编码器接口

文章目录一、编码器接口简介二、正交编码器三、通用定时器框图四、编码器接口基本结构五、工作模式六、实例&#xff08;均不反相&#xff09;七、实例&#xff08;TI1反相&#xff09;八、编码器接口测速电路设计关键代码一、编码器接口简介 Encoder Interface 编码器接口编码…

pycharm配置详解

配置解释器File-->setting-->Project&#xff1a;somename-->Project InterpreterPycharm下Python环境没有块注释"""something"""是文档&#xff0c;不是块注释Python中就没有块注释Pycharm版本控制配置Pycharm中的快捷键pycharm中自定…

手把手教你用springboot实现jdk文档搜索引擎

目录 项目背景 项目描述 项目整体架构 项目流程 构建索引 项目背景 搜索引擎是我们经常会用到的工具&#xff0c;例如我们熟知的百度&#xff0c;谷歌等搜索引擎。除了网络搜索引擎&#xff0c;还有很多地方也有搜索引擎的身影&#xff0c;例如视频网站的搜索框&#xff0c;…

Windows系统下使用mingw32编译curl-7.87.0办法

使用工具&#xff1a;Windows10QT5.14.2CMake (cmake-gui)curl-7.87.0 编译办法&#xff1a; 1、下载CURL源码&#xff1a;curl - Download&#xff0c;解压缩zip文件到指定路径下&#xff08;如&#xff1a;D:\QTCode\curl-7.87.0&#xff09; 2、新增环境变量&#xff0c;打…

为什么说IO密集型业务,线程数是CPU数的2倍?

I/O密集型业务&#xff0c;线程数量要设置成 CPU 的 2 倍&#xff01; 也不知道这是哪本书的坑爹理论&#xff0c;现在总有一些小青年老拿着这样的定理来说教。说的信誓旦旦&#xff0c;毋庸置疑&#xff0c;仿佛是权威的化身。讨论时把这样的理论当作前提&#xff0c;真的是受…

MySQL复制底层技术——单线程复制、DATABASE并行复制

1. 单线程复制 单线程复制是MySQL最早出现的主从复制技术&#xff0c;本节我们将对单线程复制做进一步说明。 在MySQL5.6之前的版本中&#xff0c;从库复制不支持多线程&#xff0c;所以当主库写压力稍微大一点时&#xff0c;从库就会出现复制延迟。当然&#xff0c;目前的最…

网络音频广播RtpCast软件

RtpCast是一款基于Windows平台运行的网络音频广播软件。这款RTPCast软件可以以目标分组的方式播放电脑系统声卡&#xff08;麦克风、喇叭和音频混合器&#xff09;、MP3文件列表和网络Rtp音频流等音源到终端设备。此外&#xff0c;RtpCast网络音频广播软件支持方案调度&#xf…