jackson 读取多文件_Spring Boot系列之读取配置

使用SpringBoot框架开发,读取配置是少不了的,那么你会读取配置吗?你会写配置吗?List?Map?

998d7693369b825735658d9ba0389ab3.png

1 目的

本节我们要解决如下几个问题:

  • 如何使用Spring Boot读取配置文件?有哪些方式?

  • 常用的几种数据结构,如字符串、整数、List、Map,如何配置?如何读取?

  • 如何自定义配置文件的路径?

2 读配置文件


Spring Boot默认的配置文件有两种格式: application.properties 和 application.yml 。

查找顺序是首先从application.properties 查找,如果找不到,再查找 application.yml


优先级: application.properties > application.yml 

2.1 使用 @Value 读取配置

配置如下:

erwin.name=冯文议
erwin.age=20
erwin.sex=男
erwin.english-name=Erwin Feng
erwin.birthday=1992/02/26
erwin.like=movie,game,music,tea,travel
erwin.visitedCities=巴中,揭阳,广州,从化,成都,三亚,上海,杭州,北京
erwin.moreOther={myWeb:'https://fengwenyi.com',github:'https://github.com/fengwenyi'}

代码如下:

package com.fengwenyi.spring_boot_config_sample.config;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

import java.util.*;

/**
* @author Erwin Feng
* @since 2020/8/11
*/
@Data
@Configuration
public class ReadConfigByValue {

@Value("${erwin.name}")
private String name;

@Value("${erwin.age}")
private Integer age;

@Value("${erwin.sex}")
private String sex;

@Value("${erwin.english-name}")
private String englishName;

@Value("${erwin.birthday}")
private Date birthday;

@Value("${erwin.like}")
private List likes;@Value("#{'${erwin.visitedCities}'.split(',')}")private List visitedCities;@Value("#{${erwin.moreOther}}")private Map moreOther;
}

2.2 使用 @ConfigurationProperties 读取配置

配置如下(properties格式)

author.name=冯文议
author.age=20
author.sex=男
author.english-name=Erwin Feng
author.birthday=1992/02/26
author.like[0]=movie
author.like[1]=game
author.like[2]=music
author.like[3]=tea
author.like[4]=travel
author.visitedCities=巴中,揭阳,广州,从化,成都,三亚,上海,杭州,北京
author.moreOther.myWeb=https://fengwenyi.com
author.moreOther.github=https://github.com/fengwenyi

配置如下(yaml格式)

author:
name: 冯文议-yml
age: 20
sex: 男
english-name: Erwin Feng
birthday: 1992/02/26
like:
- movie
- game
- music
- tea
- travel
visitedCities: 巴中,揭阳,广州,从化,成都,三亚,上海,杭州,北京
moreOther:
myWeb: https://fengwenyi.com
github: https://github.com/fengwenyi


代码如下:

package com.fengwenyi.spring_boot_config_sample.config;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
* @author Erwin Feng
* @since 2020/8/12
*/
@Data
@Configuration
@ConfigurationProperties(prefix = "author")
public class AuthorConfig implements Serializable {

private static final long serialVersionUID = 9032405467573421607L;

private String name;

private Integer age;

private String sex;

private String englishName;

@JsonFormat(pattern = "yyyy/MM/dd")
private Date birthday;

private List like;private List visitedCities;private Map moreOther;
}


读取出来的数据展示:

{
"name":"冯文议",
"age":20,
"englishName":"Erwin Feng",
"birthday":"1992/02/26",
"likes":[
"movie",
"game",
"music",
"tea",
"travel"
],
"visitedCities":[
"巴中",
"揭阳",
"广州",
"从化",
"成都",
"三亚",
"上海",
"杭州",
"北京"
],
"moreOther":{
"myWeb":"https://fengwenyi.com",
"github":"https://github.com/fengwenyi"
}
}

2.3 通过注入环境变量来获取配置信息

    @Autowired
private Environment environment;

3 @Value 用法

3.1 设置默认值

格式:@Value("${name:defaultValue}")

当配置文件找不到这个配置时,就会返回默认值,如果没有默认值,就会报错。

3.2 可以直接读取系统的属性值

如:@Value("${java.home}")

D:JavaJava8jdk1.8.0_251jre

3.3 可以用在方法和参数上,当做单元测试

    // 单元测试-读取配置文件的值
@Value("${erwin.like}")
public void testReadLike(String like, @Value("${erwin.sex}") String sex) {
System.out.println("1===>" + like);
System.out.println("1===>" + sex);
}
参数 like 会取 @Value("${erwin.like}") 的值
参数 sex 会取 @Value("${erwin.sex}") 的值
经过测试,多个方法,执行顺序是随机。
特别注意:这个只是在启动的时候执行,但是实际调用的时候,还是传入的值。

3.4 读取list的值

方法一:
配置文件:

erwin.like=movie,game,music,tea,travel


Java代码:

@Value("${erwin.like}")
private List likes;

方法二:

erwin.visitedCities=巴中,揭阳,广州,从化,成都,三亚,上海,杭州,北京

Java代码:

@Value("#{'${erwin.visitedCities}'.split(',')}")
private List visitedCities;

3.5 读取Map的值

配置文件:

erwin.moreOther={myWeb:'https://fengwenyi.com',github:'https://github.com/fengwenyi'}

Java代码:

@Value("#{${erwin.moreOther}}")
private Map moreOther;

3.6 读取系统属性

@Value("#{systemProperties}")
private Map systemPropertiesMap;

3.7 给私有属性赋值

@Component
@PropertySource("classpath:values.properties")
public class PriorityProvider {

private String priority;

@Autowired
public PriorityProvider(@Value("${priority:normal}") String priority) {
this.priority = priority;
}

// standard getter
}

4 @ConfigurationProperties

package com.fengwenyi.spring_boot_config_sample.config;

import com.fengwenyi.spring_boot_config_sample.support.YamlPropertySourceFactory;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import java.io.Serializable;

/**
* @author Erwin Feng
* @since 2020/8/13
*/
@Data
@Configuration
@ConfigurationProperties(prefix = "db")
//@PropertySource({"classpath:config/db.properties"})
@PropertySource(value = {"classpath:config/db.yml"}, factory = YamlPropertySourceFactory.class)public class DBConfig implements Serializable {

private static final long serialVersionUID = -6527591545525817929L;

/** 服务器地址 */
private String host;

/** 端口 */
private Integer port;

/** 数据库名 */
private String dbName;

/** 用户名 */
private String username;

/** 密码 */
private String password;
}

配置文件:

db:
host: localhost
port: 3306
db-name: test
username: root
password: 123456
说明:
1、@Configuration 表明这是一个Spring配置,会注入到Spring容器中。
2、@ConfigurationProperties(prefix = "db") 表示这个类与配置文件关联,其中prefix指明前缀。
3、@PropertySource 这个指明配置文件的位置,如果没有这个配置,则会从默认的配置文件读取。默认的配置文件:application.properties > application.yml。另外,这个默认只支持properties类型的文件,所以,需要配置factory。
4、@PropertySource也可以与@Value结合使用。

参考链接

  • @Value用法:https://www.baeldung.com/spring-value-annotation

  • 自定义配置 只读properties 不读 yml文件:https://blog.csdn.net/WTUDAN/article/details/103313167

  • Spring配置文件user.name配置无效:https://blog.csdn.net/u013536829/article/details/80027391

关于

我是冯文议(Erwin Feng),Java Developer,专注于程序设计与开发。开源项目:JavaLib、api-result。喜欢电影、游戏、音乐、茶、旅行。
我的个人网站:https://fengwenyi.com
我的Github:https://github.com/fengwenyi

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

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

相关文章

ab plc编程软件_AB编程软件及所有组态软件授权及安装教程包含FTViewV11

前面发了几个求助的帖子,希望有朋友能提供些Factory Talk View V11的安装和授权,但是一直没有什么回复,今天结合别人的经验,算是把授权安装搞定了,在这里发布出来,希望能帮助到更多的朋友,授权和…

c++ udp多线程 例子_[内附完整源码和文档] 基于udp实现tcp功能进行大文件传输

一.项目要求Please choose one of following programing languages: C, C, Java, Python;本项目采用的是python3.6LFTP should use a client-server service model;本项目使用客户端-服务器的模式LFTP must include a client side program and a server side program; Client s…

C语言中 1%3,算术什么意思啊 算数什么意思

算术什么意思啊 算数什么意思以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!算术是什么意思数学什么是算术和算术和是正数的和,即绝对值的和,例如213.57,…

python 消息框但不影响程序执行_还在用print()查找错误?日志消息不香嘛?| 原力计划...

作者 | 灰小猿责编 | 王晓曼出品 | CSDN博客最近在做项目开发的时候,跟小伙伴聊到修 Bug 这件事。嗯,对于一只没技术的程序猿来说,修 Bug 的确是一件让人头疼的事情,尤其是对于比较大型的项目开发,在变量较多的时候&am…

vue中传值和传引用_vue prop属性传值与传引用示例

vue prop属性传值与传引用示例vue组件在prop里根据type决定传值还是传引用。简要如下:传值:String、Number、Boolean传引用:Array、Object若想将数组或对象类型也以值形式传递怎么办呢?如下方式可以实现:// component-…

.sql文件_Mysql分组排序及Sql文件执行

最近在做一个临时项目,采用的是mysql开发,主要涉及两个问题:1.一个是传参问题;2.另一个是实现对数据分组取前4的数据。个人感觉很有意义,特此记录一下。一.传参问题执行mysql文件,需要从外部传入参数时&…

android 动态库 后缀,Android Robolectric加载运行本地So动态库

前言Robolectric 是 Android 的单元测试框架,运行无需 Android 真机环境直接运行在 JVM 之上,所以在 test case 运行速度效率上有了很大提升,接近于 Java JUnit test(JUnit test > Robolectric ≫ androidTest)。不过框架本身并不支持 so …

java web输出语句到控制台_Java工程师(6).循环结构

搞清楚循环结构语句的执行效果与使用场景。程序中的循环流程程序中的循环流程试着编写程序实现下列功能:在控制台中输出100个Hello字符串。在控制台中输出从 1 到 100 的数字。… …循环结构的三要素循环结构必然包含如下三要素:循环变量 (循…

sap生产工单报工_SAP系统PP (ProductionPlanning) 模块知识培训

SAP系统PP(ProductionPlanning)模块知识培训主要内容为支持生产系统规范使用SAP系统开展日常业务,掌握SAP系统常用操作和异常处理的方法,人力资源部在6月10日下午组织实施了一期《SAP系统PP模块知识》的培训。本次培训由信息技术部主管工程师解虎授课&am…

64位程序怎么判断指针是否有效_AArch64应用程序级编程模型

根据实现选择,体系结构支持多级执行特权,由从EL0到EL3的不同异常级别表示。EL0对应于最低的特权级别,通常被描述为无特权。应用层程序员模型是在EL0上执行软件的程序员模型。系统软件决定异常级别,因此决定软件运行的特权级别。当…

n个小球放入m个盒子中_飞么盒子卫生巾自助售卖机前景

嘿,你有没有经历过,出门在外来大姨妈却没带M巾呢?尴尬丛生的你选择怎么做?现在,有了新选择,这也是今天我们迫不及待想要和你们介绍的新朋友—飞么盒子,由Faimes飞么品牌自主研发出品的卫生巾售卖…

Android代码设置角标,Android上的Badge,快速实现给应用添加角标

应用角标是iOS的一个特点,原生Android并不支持。或许是由于当时iOS的通知栏比较鸡肋(固然如今已经改进了不少),而Android的通知栏功能强大?因此才出现了一方依赖于数字角标,一方坚持强大的通知栏,在平常使用中这两种交…

opencv模糊图像变清晰_opencv-python 4.2图像模糊

图像模糊可以去除噪音。import cv2 import numpy as npimage cv2.imread("dogcat1.jpg") cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE) cv2.imshow("input image", image)#均值模糊 dst cv2.blur(image, (5, 5)) cv2.imshow("…

datatable怎么根据两列分组_公司要IT转型,我该怎么办?用Python进行数据处理

“ 以后数据处理,都用pandas”01 面临问题作为运维人员,每周要统计很多数据,特别是周四写周报的时候,基本要花半天时间。既然已经学了Python,那就试试优化它。以统计不同厂家、不同设备类型告警量为例。需要将多份类似…

pandas尾部添加一条_Numpy与Pandas

Numpy#导入numpy包 import numpy as np ##from numpy import * #定义数组 #一维数组 anp.array([1,2,3,4]) #二维数组 bnp.array([(1,2,3),(4,5,6)]) #定义数组类型 cnp.array([(1,2),(3,4)],dtypecomplex) #array([[ 1.0.j, 2.0.j],[ 3.0.j, 4.0.j]])#数组的维数 a.shape #(…

python爬虫获取url_Python爬虫如何获取页面内所有URL链接?本文详解

如何获取一个页面内所有URL链接?在Python中可以使用urllib对网页进行爬取,然后利用Beautiful Soup对爬取的页面进行解析,提取出所有的URL。什么是Beautiful Soup? Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索…

iview table增加一行减少一行_PQ入门函数:Table.ReplaceValue

一、基础介绍Table.ReplaceValue函数的官方说明如下:Table.ReplaceValue(table as table, oldValue as any, newValue as any, replacer as function, columnsToSearch as list)该函数实现的功能是将Table中的值替换成新值,语法翻译成汉语大致如下&#…

gprs模块ftp 远程升级_基于GPRS无线通信技术的冷链监测系统

GPRS(general packet radio service)是通用分组无线业务的简称,该技术建立在GSM网络的基础上,被称为2.5 代移动通信技术,它将无线通信与Internet 紧密结合。基于GPRS的远程数据采集系统是通过中国移动的GPRS无线通信网…

小米登录协议分析_联想前副总裁常程跳槽小米数月后,波澜再起

► 文 观察者网 吕栋今年初,联想集团前副总裁常程离职2天即加盟小米,这一举动是否违反竞业协议,双方当时曾各执一词。最近,由于联想方面在北京提起劳动仲裁,此事也再度引发舆论关注。9月21日,针对“联想与…

值从哪里来_Linux used内存到底去哪里了呢?

Linux used内存到底去哪里了呢?阅读文章之前请先思考这么个问题我ps aux看到的RSS内存只有不到30M,但是free看到内存却已经使用了7,8G了,已经开始swap了,请问ps aux的实际物理内存统计是不是漏了哪些内存没算?我有什么…