Spring Boot 配置文件 · properties 基本语法 · yml 基本语法 · yml 配置不同数据以及 null · yml 配置文件读取

一、配置文件作用

整个项目中所有重要的数据都是在配置文件中配置的,例如:

  • 数据库的连接信息(包含用户名和密码的设置);
  • 项目的启动端口(tomcat - 8080);
  • 第三方系统的调用密钥等信息(调用其它 app 的接口);
  • 用于发现和定位问题的普通日志和异常日志等。

想象一下,Spring Boot 项目如果没有配置文件,那么连接和操作数据库查看用于排查问题的日志信息都不存在,Spring Boot 框架就没有那么简便了。所以学会 Spring Boot 的配置文件很重要。



二、配置文件的格式

Spring Boot 配置文件主要分为以下两种格式:

.properties
.yml

两种配置格式都可以使用。

properties 类型的配置文件是创建 Spring Boot 项目时默认的文件格式。
yml 属于新版配置文件格式,提供了更丰富的功能。

特殊说明

  1. 理论上讲,properties 和 yml 都是可以一起存在于一个项目中。当 properties 和 yml 一起存在同一个项目并且文件中都出现了同样的配置,例如:properties 和 yml 都配置了 “server.port”,那么这时候会以 properties 文件中的为主。也就是说,properties 配置文件的优先级最高,加载完properties 才会加载 yml 文件的配置信息
  2. 虽然两种配置文件的格式可以共存,但是在实际业务中,我们通常会采用统一的配置文件格式,这样可以更好的维护。


三、properties 配置文件说明

properties 配置文件时最早期的配置文件格式,也是创建 Spring Boot 项目默认的配置文件。


3.1 properties 基本语法

properties 是以键值对的形式配置的,key 和 value 之间是可以用 “=” 号连接。

# 配置项目的口号
server.port=8088
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root

ps. 配置文件中可以使用 “#” 来添加注释信息。


3.2 读取配置文件

如果在项目中,想要读取配置文件的内容,可以使用 @Value 注解来实现。

@Value 注解使用 “${ }” 的格式读取。

@Component
public class ReadYml {
	// 读取配置文件中server.port所指向的value值
    @Value("${server.port}")
    private String port;

    @PostConstruct
    public void postConstruct() {
        System.out.println("port is " + port);
    }
}

执行结果:已经成功将端口号修改为 8088.

@Component 在 Spring Boot 启动时会注入框架中,注入框架中会执行 @PostConstruct 初始化方法,这时候就能读取到配置信息了。


3.3 properties 缺点分析

properties 配置是以 key - value 的形式配置的,如图:

从上图可以看出,properties 配置文件中有很多冗余的信息,连接数据库 spring.datasource 就写了三遍。

要解决这个问题,就要使用 yml 配置文件的格式化了。



四、yml 配置文件说明

yml 是 YMAL 的缩写,全称是 Yet Another Markup Language 翻译成中文就是 “另一种标记语言”。

yml 是一个可读性高,易于理解,用来表达数据序列化的格式。它的语法与其它成熟的语言类似,而且可以简单表达数组、散列表、标量等数据形态
它使用了大量空白符号缩进和依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等。

yml 最大的优势是可以跨语言,不仅在 Java 中使用 golang、python 也可以使用 yml 作为配置文件。


4.1 yml 基本语法

yml 是树状结构的配置文件,它的基本语法是 “key: value”。注意,key 和 value 之间使用英文冒号加空格的方式组成,其中空格不可省略。

基础语法如下:

# 设置端口号
server:
  port: 9090
  # 记得在冒号和 value 之间加空格

# 错误写法
server:
  port:9999

配置正确,代码会是高亮显示的,错误写法并没有高亮显示。


4.2 yml 与 properties 格式对比

yml 使用示例:

spring:
  datasource:
    url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8
    username: root
    password: root

yml 和 properties 连接数据库的配置相比


4.3 yml 配置不同数据类型以及 null

# 字符串
string:
  value: hello
#布尔类型
boolean:
  value1: true
  value2: false
# 整数
int:
  value1: 10
  value2: 0b1010_0111_0100_1010_1110	# 二进制
# 浮点数
float:
  value1: 3.1415926
  value2: 314159e-5	#科学计数法
# Null, ~ 表示 null
null:
  value: ~

4.4 yml 配置读取

yml 读取配置的方式和 properties 相同,使用 @Value 注解即可,实现代码如下:

4.4.1 读取配置文件中的字符串

@Component
public class ReadYml {

    @Value("${string.hello}")
    private String hello;

    @PostConstruct
    public void postConstruct() {
        System.out.println("string.hello is " + hello);
    }
}

运行结果:

4.4.2 读取配置文件中的 null

@Component
public class ReadYml {
    @Value("${mynull.value}")
    private Object getnull;

    @PostConstruct
    public void getMyNull() {
        System.out.println("mynull.value is " + getnull);
    }
}

运行结果:

4.4.3 注意事项:value 值加单双引号

尝试在 application.xml 中配置如下信息:

string1: 
  str1: hello \n spring boot.
  str2: 'hello \n spring boot.'
  str3: "hello \n spring boot."

读取程序实现如下:

@Component
public class ReadYml {
    @Value("${string1.str1}")
    private String str1;

    @Value("${string1.str2}")
    private String str2;

    @Value("${string1.str3}")
    private String str3;

    @PostConstruct
    public void postConstruct() {
        System.out.println("string1.str1: " + str1);
        System.out.println("string1.str2: " + str2);
        System.out.println("string1.str3: " + str3);
    }
}

运行结果:

从上述结果可以看出:

  • 字符串默认不用加上单引号或者双引号。
  • 单引号会转义特殊字符,特殊字符最终还是一个普通的字符串数据。
  • 双引号不会转义特殊字符,会让特殊字符表达出本身的意思。

4.4.4 配置对象

我们还可以在 yml 中配置对象,如下:

# 写法一:
user1:
  id: 1
  name: jjj
  age: 18

# 写法二:
user2: {id: 1,name: ccc,age: 15}

这时候还可以使用 @Value 来读取配置信息,但是这是一个对象!对象的属性有可能很多,这就需要多个 @Value 一一对应,这在实际开发中是不可能的。

所以我们要使用另一个注解 @ConfigurationProperties 来读取,具体实现如下:

因为是一个对象,所以先要有实体类装载。

@Component
@ConfigurationProperties(prefix = "user1")	// 需要和 yml 配置文件中的相同
public class User {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    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 "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

调用类实现如下:

@Component
public class ReadYml {

    @Autowired
    private User user;

    @PostConstruct
    public void postConstruct() {
        System.out.println(user);
    }
}

程序运行结果:


4.4.5 配置集合(数组)

配置文件也可以配置 list 集合。

# 写法一
dbtypes1:
  name:
    - mysql
    - sqlserver
    - db2
# 写法二. 行内写法
dbtypes2: { name: [aaa,bbb,ccc]}

集合的读取和对象一样,也是使用 @ConfigurationProperties 来读取的,具体实现如下:

@Component
@ConfigurationProperties(prefix = "dbtypes2")
public class ListConfig {
    private List<String> name;

    public List<String> getName() {
        return name;
    }

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

打印类的实现如下:

@Component
public class ReadYml2 {
    @Autowired
    private ListConfig listConfig;

    @PostConstruct
    public void postConstruct() {
        System.out.println(listConfig.getName());
    }
}

4.4.6 查看更多系统配置项

本文有限,Spring Boot 还有很多系统配置项,可以访问官网查看:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties



五、properties 与 yml 总结

  • properties 是以 key - value 键值类型的配置形式;而 yml 使用类似 json 格式的树状配置方式,key 和 value 之间使用冒号加空格的方式设置。
  • properties 为早期并且默认的配置文件格式,但其配置存在一定的冗余数据,使用 yml 可以很好的解决数据冗余的问题。
  • yml 通用性更好,支持更多语言 Java、Go、Python 等。
  • yml 虽然与 properties 共存,但一个项目中建议使用统一的配置类型文件。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值