详解!Spring Boot 配置文件

Java
250
0
0
2023-06-16
标签   SpringBoot

文章目录

配置文件的作用就是 保存项目中的所有重要的数据信息以及一些通用配置

比如启动一个项目,默认情况下 Tomcat 会占用 8080 端口,但是有些时候会因为 8080 端口已经被占用了,导致启动项目失败,解决办法要么是先查到占用端口的进程,然后从任务管理器中关闭进程,要么就是就重新设置端口号,然而一般的重置 端口号 的过程并不方便。

但是在配置文件中只要写一句 server.port=XXXX,启动项目,就可以发现端口号已经被改成 XXXX ,方便的很

还有 数据库的连接信息 第三方系统的调用密钥 等信息、 日志信息的配置 等等

Spring Boot 常用的配置文件的格式有两种:

 .properties
.yml

这两种配置文件的格式是可以同时存在于一个项目中的,如果两配置文件中有同样的配置(比如都配置端口信息),此时会以 .properties 格式 配置的端口为主,其 优先级会更高

加载完 .properties 文件后,就会加载 .yml 文件

一个项目中可以存在很多 properties 文件(yml 文件),名字可以随便起,但是 Spring Boot 项目启动时,只会自动加载名字为 application 的配置文件

实际业务中,一般会统一使用其中一种配置文件的格式,可以降低故障率

一、properties 文件

在学习 .properties 文件之前,需要先装一个插件 Spring Tools ,yml 文件中是有代码提示的但是 properties 文件没有(指的是社区版),安装了该插件后,就会有相应的代码提示

1.1 properties 基本语法

properties 是以键值对的形式配置的,key 和 value 之间只要 “=” 连接

 key=value 

注意:等号 两边不要出现空格 ,value 后面也不要出现空格

 # 端口号设置
server.port=
# 数据库连接信息设置
spring.datasource.url= jdbc : mysql :// 127.0.0.1 :3306/OJSystem
spring.datasource.username= root 
spring.datasource.password= 

1.2 读取配置文件

在项目中读取配置文件中的内容,可以通过 @Value 注解

该注解需要使用 “${}” 的格式进行读取

代码展示

 @Controller
@ResponseBody
@ Request Mapping("/index")
public class UController {
 
    @Value("${server.port}")
     private  Integer port;
    
    @RequestMapping("/port")
    public String func() {
 
        return "port:" + port;
    }
} 

注意

@Value 注解中的内容如果用 双引号 直接包含起来,表示设置一个具体的 value 值而不是配置文件中的 key ;

只有加上 ${} 才会读取到配置信息中的 key 值(server.port),将 key 值对应的 value 值(9090)赋值给 port 变量;

结果展示

1.3 properties 缺点

在上面配置数据库的信息时,会发现有很多的 代码冗余 ,每条配置信息前都有 spring.datasource ,可读性是比较差的

二、.yml 文件

yml 文件就很好的解决了 properties 文件的缺点,可读性高,也易于理解,还可以表达数组、对象等数据形态,而且还跨语言,除了 Java , Go lang、 python 都可以使用该类型的配置文件

2.1 yml 基本语法

yml 是树形结构的配置文件

 key: value 

注意:key 和 value 之间有一个英文的 冒号 “:” 和一个 空格 ,两者缺一不可

 # 端口号设置
server:
  port:
# 数据库连接信息设置
spring:
  datasource:
    url: jdbc:mysql://.0.0.1:3306/OJSystem
    username: root
    password: 

通过例子,可以发现 yml 文件可以很好解决 properties 文件的代码冗余问题

通过 空格缩进程度来控制层级关系 ,如果为同级属性,缩进应当要一样

2.2 yml 的运用

yml 支持字面值、对象、数组等数据结构,也支持它们的复合结构

2.2.1 字面值

包括 字符串 、 布尔 类型、整形(包括各种 进制 )、 浮点型 (包括科学计数法)、null等

配置信息

 # 字符串类型
String: yml配置文件
# 整形
myInt:
# null
myNull:
  value: ~
# 浮点型
myDouble.value:.23 

yml 文件中读取配置信息也可以使用 @Value 注解,同 properties 用法相同

代码展示

 @Controller
@ResponseBody
@RequestMapping("/index")
public class UController {
 

    @Value("${String}")
    private String myString;
    @Value("${myInt}")
    private Integer myInt;
    @Value("${myDouble.value}")
    private Double myDouble;
    @Value("${myNull.value}")
    private Object myNull;

    @RequestMapping("value")
    public String func() {
 
        String res = "String: " + myString 
                + "----" + "myInt: " + myInt 
                + "----" + "myNull.value: " + myNull 
                + "----" + "myDouble.value: " + myDouble;
        return res;
    }
} 

结果展示

注意:yml 中的 null 不是指值为 null ,而是指什么都没有的意思,因此打印出来内容是空的

关于字符的特殊说明

在 yml 中如果字符串使用了 双引号 进行包裹,那么写了特殊字符是 不会进行转义 的,就会按照特殊字符的方式进行处理,比如 n 就会被当成换行符进行处理

如果字符串添加的是 单引号 或者 什么都没有 添加,就会将特殊字符 进行转义 ,输入的是什么输出的就是什么,特殊字符最终只是一个普通的字符串数据

配置文件

 myString:
  value: Hello n world
  value: 'Hello n world'
  value: "Hello n world" 

代码展示

 @Value("${myString.value}")
private String myString;
@Value("${myString.value}")
private String myString;
@Value("${myString.value}")
private String myString;

@RequestMapping("/myString")
public  void  func2() {
 
    System.out.println("value: " + myString1);
    System.out.println("value: " + myString2);
    System.out.println("value: " + myString3);
} 

结果显示

2.2.2 对象

yml 中可以配置对象,这是 properties 文件中所没有的

配置文件

 # 方式一
article:
  id:
  name: 人与自然
  content: 内容简介
# 方式二
article: {
  id:,name: Java发展史,content: 对Java的简介 } 

注意:无论方式一还是方式二都需要在 key 和 value 间加上英文冒号以及一个空格,方式二创建对象的方式适合于属性较少时,方式一在属性较多时会更加的直观

代码展示

想要获取到配置文件中对象的信息,可以通过之前的 @Value 注解的方式,但是这样的话,对象有多少个属性,就会需要写多少个 @Value ,会非常的麻烦

所以,可以通过其他方式将对象中的内容一下子读取到某个类中,然后通过注入的方式获取到类中的信息

首先,创建一个 Article 类

通过 @ConfigurationProperties 注解来指定 Spring Boot 启动时需要将配置文件中的哪个对象赋值到该类上,其中 prefix = 可以省略

需要注意的是 一定要提供 get/set 方法 ,尤其是 set 方法,如果不提供,项目启动后没有办法将配置文件中对应对象的属性赋值进来,就会报错。不提供 get 方法虽然不会报错,但是没有办法通过方法获取对象的某个属性了

属性名需要与配置文件中的属性名一一对应 ,否则获取的时候就会找不到对应的属性名,结果为默认值

 @Component
@ConfigurationProperties(prefix = "article")
public class Article {
 
    private int id;
    private String name;
    private String content;

    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 String getContent() {
  return content; }
    public void setContent(String content) {
  this.content = content; }

    @Override
    public  String  toString() {
 
        return "Article{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", content='" + content + ''' +
                '}';
    }
} 

然后,进行 依赖的注入

需要使用 @Autowired 注解或者 @Resource 注解将 Article 类注入到依赖它的类中,这里使用的前者注解。注入方法这里使用的是属性注入

 @Controller
@ResponseBody
public class ArticleController {
 
    @Autowired
    private Article article;

    @RequestMapping("/article")
    public void func() {
 
        System.out.println(article);
    }
} 

结果展示

2.2.3 数组

配置文件

 # 方法一
book-list:
    books:
      - Java书
      - Python书
      - C++书
# 方法二
booklist: {
  books: [人与自然,美人鱼] } 

“:” “-” 后面都需要 添加空格

拿方法一的案例来说,就相当于说有一个 Key 值为 book-list,key 值下面有一个 books 属性,该属性里面存储了三个信息:Java书、Python书、 C+ +书

需要注意的是方法一中的命名方式,由于 SpringBoot 2.X 版本对配置文件中的命名规范有强制性的要求,不允许使用驼峰形式(比如bookList),需要按照提示说的那样使用 – 代替

代码显示

首先,创建一个 BookList 类

同样可以通过 @ConfigurationProperties 注解来指定 Spring Boot 启动时需要将配置文件中的哪个对象赋值到该类上

属性名 books 需要和配置文件中 key 为 book-list 的 value 中的属性名相对应

同样也需要 提供 get/set 方法 ,这里使用了 @Data 注解。该注解来源于创建项目时引入的 lombok 依赖 ,加上该注解,就可以提供 get/set 方法、 toString 方法…

 @Component
@ConfigurationProperties(prefix = "book-list")
@Data
public class BooKList {
 
    private List<String> books;
} 

然后,进行依赖的注入

 @Controller
@ResponseBody
public class ListController {
 
    @Autowired
    private BooKList booKList;

    @RequestMapping("/list")
    public void getBooks() {
 
        System.out.println(booKList.getBooks());
    }
} 

结果显示

三、properties 和 yml 区别总结

  • 语法格式
  • properties :以 key=value 的键值对形式配置的配置文件,其中 key 是以 “.” 进行分割的
  • yml :使用类似 json 格式的树形配置方式进行配置,使用缩进来控制层级关系,key 和 value 之间使用冒号和一个空格隔开,皆不可省略
  • 冗余问题
  • properties :是一种默认的,早期的配置文件格式,配置存在数据的冗余
  • yml :很好的解决了数据冗余现象,可读性更高,写法更简洁明了
  • 通用性
  • properties :只是作为 Java 语言的配置文件
  • yml :通用性更好,支持多种语言,Java、Go、Python…,比如做云计算使用 Go 和 Java 的时候,可以通过配置中心使用同一份配置
  • 数据类型
  • properties :只支持键值对数据
  • yml :支持列表,对象,标量等等数据类型

完~~~