Spring Boot系列之读取配置
使用SpringBoot框架开发,读取配置是少不了的,那么你会读取配置吗?你会写配置吗?List?Map?
1 目的
本节我们要解决如下几个问题:
- 如何使用Spring Boot读取配置文件?有哪些方式?
- 常用的几种数据结构,如字符串、整数、List、Map,如何配置?如何读取?
- 如何自定义配置文件的路径?
2 读配置文件
<br />Spring Boot默认的配置文件有两种格式: application.properties
和 application.yml
。
查找顺序是首先从application.properties
查找,如果找不到,再查找 application.yml
。<br />
<br />优先级: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<String> likes; @Value("#{'${erwin.visitedCities}'.split(',')}") private List<String> visitedCities; @Value("#{${erwin.moreOther}}") private Map<String, String> moreOther; }
<br />
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
<br />代码如下:
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<String> like; private List<String> visitedCities; private Map<String, String> moreOther; }
<br />读取出来的数据展示:
{ "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:\Java\Java8\jdk1.8.0_251\jre
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的值
方法一:<br />配置文件:
erwin.like=movie,game,music,tea,travel
<br />Java代码:
@Value("${erwin.like}") private List<String> likes;
方法二:
erwin.visitedCities=巴中,揭阳,广州,从化,成都,三亚,上海,杭州,北京
Java代码:
@Value("#{'${erwin.visitedCities}'.split(',')}") private List<String> visitedCities;
3.5 读取Map的值
配置文件:
erwin.moreOther={myWeb:'https://fengwenyi.com',github:'https://github.com/fengwenyi'}
Java代码:
@Value("#{${erwin.moreOther}}") private Map<String, String> moreOther;
<br />
3.6 读取系统属性
@Value("#{systemProperties}") private Map<String, String> 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结合使用。
<br />
参考链接
- @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。喜欢电影、游戏、音乐、茶、旅行。<br />我的个人网站:https://fengwenyi.com<br />我的Github:https://github.com/fengwenyi

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
plumelog 发布 3.1.2 版本,好用的 Java 分布式日志系统
plumelog发布3.1.2版本 本次版本更新内容: 1.支持自定义自定义日志字段 通过sf4j-mdc 可以定义更多的自定字段,扩展字段 2.优化日志查询效率 从新优化索引内容,精简查询语句,大大提升查询速度 3.优化日志搜集上报效率,增加maxQueue配置项,用来控制本地队列大小 4.支持企业微信报警通知 5.合并了server,ui,减少了一个部署件,部署更简单 6.修复了一些已知的bug Plumelog介绍: plumelog专业致力于java日志系统,个人项目非公司项目,永久免费开源,gitee(码云)GVP项目(最有价值开源项目) 优点:1.接入方便,基于java log4j,logback 原项目不用做任何改动 2.采用日志异步上报方式,不占用本地项目磁盘空间 3.查询效率高,查询语句,日志格式经过设计和优化 4.查询界面人性化 5.作为日志系统,不会影响原有的系统运行,不影响原有系统性能 官网地址:http://www.plumelog.com
- 下一篇
死信队列和延迟队列的使用?
死信消息: 1.消息被拒绝(Basic.Reject或Basic.Nack)并且设置 requeue 参数的值为 false 2.消息过期了 3.队列达到最大的长度 过期消息: 在 rabbitmq 中存在2种方可设置消息的过期时间 第一种通过队列设置:在队列申明的时候使用 x-message-ttl 参数,单位为毫秒,这种设置后,该队列中所有的消息都存在相同的过期时间 第二种通过对单个消息设置,是设置消息属性的 expiration 参数的值,单位为毫秒。那么每条消息的过期时间都不一样。 如果同时使用这2种方法,那么以过期时间小的那个数值为准。当消息达到过期时间还没有被消费,那么那个消息就成为了一个 死信 消息。 延时队列:在rabbitmq中不存在延时队列,但是我们可以通过设置消息的过期时间和死信队列来模拟出延时队列。消费者监听死信交换器绑定的队列,而不要监听消息发送的队列。 有了以上的基础知识,我们完成以下需求: 需求:用户在系统中创建一个订单,如果超过时间用户没有进行支付,那么自动取消订单。 分析: 1、上面这个情况,我们就适合使用延时队列来实现,那么延时队列如何创建 2、延...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7设置SWAP分区,小内存服务器的救世主
- Mario游戏-低调大师作品
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- 2048小游戏-低调大师作品
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库