目录
一、配置文件的作用
二、配置文件的格式
三、properties 配置文件说明
3.1 properties 基本语法
3.2 读取配置⽂件
3.23properties 配置缺点分析
四、yml 配置文件说明
yml 优点分析
4.1 yml 基本语法
4.2 yml 配置简单的数据类型及 null
4.3 yml 配置对象
4.4 yml 配置 list 集合
五、properties 和 yml 的总结
六、Spring Boot 读取配置文件的方法
使用 Environment 读取配置文件
整个项⽬中所有重要的数据都是在配置⽂件中配置的,⽐如:
- 数据库的连接信息(包含⽤户名和密码的设置);
- 项⽬的启动端⼝;
- 第三⽅系统的调⽤秘钥等信息;
- ⽤于发现和定位问题的普通⽇志和异常⽇志等。
想象⼀下如果没有配置信息,那么 Spring Boot 项⽬就不能连接和操作数据库,甚⾄是不能保存可以⽤于排查问题的关键⽇志,所以配置⽂件的作⽤是⾮常重要的
除了上述的内容,还有很多重要的属性都需要在配置文件中配置。如果想要查看 Spring Boot 更多系统配置项,Spring 的官网中已经整理好了这些信息。链接如下:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties
Spring Boot 的配置文件主要有两种格式
- .properties
- .yml
这两个的功能是一样的,但是,这两个是不同时代的产物,properties 相当于老款的配置文件,而 yml 相当于新款的配置文件,要想使用新款的配置文件,在 /src/main/resources
目录下手动创建一个 application.yml
文件就行
要注意的是在创建 Spring Boot 项目时,项目默认会带一个 application.properties
配置文件
补充:
- 理论上讲 properties 可以和 yml ⼀起存在于⼀个项⽬当中,当 properties 和 yml ⼀起存在⼀个项⽬中时,如果配置⽂件中出现了同样的配置,那么这个时候会以 properties 中的配置为主,也就是 .properties 配置⽂件的优先级最⾼,但加载完 .properties ⽂件之后,也会加载 .yml ⽂件的配置信息。
- 虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取⼀种统⼀的配置⽂件格式,这样可以更好的维护(降低故障率)。
properties 配置⽂件是最早期的配置⽂件格式,也是创建 Spring Boot 项⽬默认的配置⽂件
properties 是以键值对的形式配置的,key 和 value 之间用 =
号来连接的。key 就是要配置的属性,value 就是要设置的值。
实例代码:
#配置端口号信息
server.port=8081
#配置数据库信息
spring.datasource.url=jdbc:mysql://localhost:3306
spring.datasource.name=root
spring.datasource.password=123456
如果在项⽬中,想要主动的读取配置⽂件中的内容,可以使⽤ @Value 注解来实现。
@Value 注解使⽤“${}”的格式读取,如下代码所示
package com.example.demo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class ReadProperties {
@Value("${server.port}")
private String port;
@PostConstruct
public void doPostConstruct(){
System.out.println("port = "+ port);
}
}
@Component 在 Spring Boot 启动时候会注⼊到框架中,注⼊到框架中时会执⾏ @PostConstruct初始化⽅法,这个时候就能读取到配置信息了。
properties 配置是以 key-value 的形式配置的,如下图所示:
从上述配置key看出,properties 配置⽂件中会有很多的冗余的信息 ,想要解决这个问题,就可以使⽤ yml 配置⽂件的格式化了
yml 是 YAML 是缩写,它的全称 Yet Another Markup Language 翻译成中⽂就是“另⼀种标记语
⾔”。
- yml 是⼀个可读性⾼,写法简单、易于理解,它的语法和 JSON 语⾔类似。
- yml ⽀持更多的数据类型,它可以简单表达清单(数组)、散列表,标量等数据形态。它使⽤空⽩符号缩进和⼤量依赖外观的特⾊,特别适合⽤来表达或编辑数据结构、各种配置⽂件等。
- yml ⽀持更多的编程语⾔,它不⽌是 Java 中可以使⽤在 Golang、PHP、Python、Ruby、JavaScript、Perl 中
yml 是树型结构的配置文件,它的基础形式是 key: value
,yml 的基础语法具有以下的规则:
key: value
表示键值对关系,冒号后面必须有一个空格使用空格的缩进表示层级关系,空格数目不重要,只要是左对齐的一列数据,都是同一个层级的
大小写敏感
其中第⼀项的配置为正确的,key 也是⾼亮显示的,⽽第⼆项没有空格是错误的使⽤⽅式,第⼆项的key 也没有⾼亮显示。
配置数据库示例:
yml 配置:
#字符串
string:
value: hello zifuchuan
#整型
int:
value: 10
#布尔类型
boolean:
value: tru
读取代码: 通过 @Value
注解来读取配置中的简单数据类型和 null
package com.example.demo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ReadYml {
@Value("${int.value}")
private int val;
@Value("${string.value}")
private String val2;
@Value("${boolean.value}")
private boolean val3;
@RequestMapping("/read")
public void read(){
System.out.println("整数 =>"+ val);
System.out.println("字符串 =>"+ val2);
System.out.println("布尔类型 =>"+ val3);
}
}
在 yml 中,字符串如果使用了双引号包裹,那么特殊字符是不会转义的,比如 \n 就表示换行;而如果字符串什么都不包裹或者用单引号包裹,那么特殊字符就会自动进行转义。
yml 配置:
#写法一
student:
id: 1
name: 竹筒
age: 250
#写法二
user: {id: 2, username: 小白, age: 2}
读取代码:
首先需要创建一个匹配配置文件中对象的类,并且读取配置文件中的对象就不能使用 @Value 注解,而需要使用 @ConfigurationProperties 注解,该注解放在创建的类上,并且有一个 prefix 属性用于设置配置文件中对应的 key。创建的类中必须要有 Setter 和 Getter 方法。
package com.example.demo;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "student")
public class Student {
private int id;
private String name;
private int age;
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + 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;
}
}
通过创建的类读取到配置文件的对象后,将该类注册到 Spring 容器中,当使用时,直接通过 @Autowired
或者 @Resource
注解注入就好。
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ReadYml {
@Autowired
private Student student;
@RequestMapping("/student")
public void stu(){
System.out.println(student.toString());
}
}
yml 配置:
#集合写法一
list:
animal6:
- 狗
- 猫
- 马
#集合写法二
list2: {fruit: [苹果,香蕉,西瓜]}
读取代码:
yml 配置集合时,也需要通过
@ConfigurationProperties
注解来读取,该注解的 prefix 属性对应着上述 yml 配置的 dbtypes1 或者 dbtypes2。接下来创建一个匹配配置文件中集合的类
千万注意(private List
package com.example.demo;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@ConfigurationProperties(prefix = "list")
public class ListObjec {
private List animal6;
public List getAnimal6() {
return animal6;
}
public void setAnimal6(List animal6) {
this.animal6 = animal6;
}
}
通过创建的类读取到配置文件的对象后,将该类注册到 Spring 容器中,当使用时,直接通过 @Autowired
或者 @Resource
注解注入就好。
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class ReadYml {
@Resource
private ListObjec listo;
@RequestMapping("/list")
public void lis() {
System.out.println("集合为= " + listo.getAnimal6());
}
}
- properties 是以 key=value 的形式配置的键值类型的配置⽂件,⽽ yml 使⽤的是类似 json 格式的 树形配置⽅式进⾏配置的,yml 层级之间使⽤换⾏缩进的⽅式配置,key 和 value 之间使⽤“: ”英⽂ 冒号加空格的⽅式设置,并且空格不可省略。
- properties 为早期并且默认的配置⽂件格式,但其配置存在⼀定的冗余数据,使⽤ yml 可以很好的 解决数据冗余的问题。
- yml 通⽤性更好,⽀持更多语⾔,如 Java、Go、Python 等,如果是云服务器开发,可以使⽤⼀份 配置⽂件作为 Java 和 Go 的共同配置⽂件。
- yml 虽然可以和 properties 共存,但⼀个项⽬中建议使⽤统⼀的配置类型⽂件。
- yml 支持更多的数据类型
- 使用 @Value 读取配置文件
- 使用 @ConfigurationProperties 读取配置文件
- 使用 Environment 读取配置文件
前两种上面已经使用过 下面我们来测试一下第三种
Environment 是 Spring Core 中的一个用于读取配置文件的类,将此类使用 @Autowired
或者 @Resource
注入到类中就可以使用它的 getProperty
方法来获取某个配置项的值,代码如下所示:
yml配置
#写法一
student:
id: 1
name: 竹筒
age: 250
读取代码:
@Autowired
private Environment environment;
@RequestMapping("/readE")
public void read3(){
System.out.println(environment.getProperty("student.name"));
}
以上就是我对SpringBoot配置文件的理解 ,如有错误还请指出