springboot项目的配置文件信息一般放在application.yml(也有命名application.properties)文件中,当项目启动的时候,我们可以只修改配置文件中的配置,而不修改代码。如果不在配置文件中配置信息,虽然也可以实现功能,但是容易出现问题。
例如:跨系统交互时,另外一个系统(系统A)的域名或者端口发生变化,我们需要在自己的项目中对其地址信息进行修改。如果不在配置文件中进行配置,我们需要在代码中修改所有与A系统交互时的访问地址信息修改,如果存在多处与系统A交互,需要修改多处地方。修改相对较大,而且修改完之后,还需要重新发版。万一在修改时,不小心碰到了其他代码,修改了其他代码逻辑,这上线发版后出问题就麻烦了,就等着背一个线上case事故吧。
如果我们配置在配置中配置改变量,所有用到该变量的地方,我们从配置文件中进行读取。即使系统A的域名发生变化,我们可以只修改配置文件中改变量的值,不会影响到其他代码。当然,这时也有人问,你最终还是修改了东西,难免不会粗心大意碰到其他代码,这不是照样存在风险吗?
对于这个问题,可能是问问题的人还没进入公司工作,也可能是我了解的太low了。为什么这么说呢,因为这些配置文件中的值,是不由程序员进行维护的,一般这些配置文件在公司都是有专门的运维进行维护的,在上线的时候,你提供配置文件的线上配置,运维会对其进行配置或者对你配置的进行覆盖,因此,由运维进行操作,运维只会修改配置文件中的值,不会修改代码。(当然这是我所在公司的风格,其他公司我不了解)
OK,废话讲这么多了,开始正题。
1、基本配置变量读取
首先我们先介绍一下最基本的配置,没有数组list对象,没有map对象。
注意:每个键也就是(冒号左面的值),键之后必须要有一个空格,在idea下,键会变成黄色(也就是冒号后面要有一个空格)
配置文件中的配置:
info:
name: mwl
love: lwm
type: alone
对于这种只包含变量的我们一般采取两种方式取值,推荐第二种方式。
第一种方法,(变量值少时推荐使用种方法,不然需要定义多个变量进行接收):
@Value("${info.name}")
private String NAME;
@Test
public void TestValue(){
System.out.println(NAME);
}
第二种方法,采用**@ConfigurationProperties注解,其中prefix对应配置文件前缀,@Component注解用于添加到容器中,@Data**注解属于插件lombok中的注解,用于减少get、set以及toString等方法的代码量。
package com.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @author: MWL
* @date: 2020/3/6 9:59 上午
**/
@Component
@Data
@ConfigurationProperties(prefix = "info")
public class InfoConfig {
private String name;
private String love;
private String type;
}
单元自测类方法测试:
@Value("${info.name}")
private String NAME;
@Resource
private InfoConfig infoConfig;
@Test
public void TestConfigValue(){
System.out.println("infoConfig.toString():"+infoConfig.toString());
System.out.println("infoConfig.getName():"+infoConfig.getName());
System.out.println("NAME:"+NAME);
}
//程序运行结果如下:
infoConfig.toString():InfoConfig(name=mwl, love=lwm, type=alone)
infoConfig.getName