【Spring Boot】Spring Boot配置文件详情

前言

 Spring Boot是一个开源的Java框架,用于快速构建应用程序和微服务。它基于Spring Framework,通过自动化配置和约定优于配置的方式,使开发人员可以更快地启动和运行应用程序。Spring Boot提供了许多开箱即用的功能和插件,包括嵌入式Web服务器、安全性、数据访问、缓存、测试和监控等,极大地简化了开发人员的工作。同时,Spring Boot还提供了可扩展性和可定制性,让开发人员可以根据特定的需求完全自定义应用程序。本文就 SpringBoot 项目中配置文件的作用以及两种不同形式的配置文件的使用分别进行阐述。
表情包01



1 配置文件

配置文件是一种存储应用程序配置信息的文件,它包含了应用程序所需要的各种参数、选项和设置。
配置

2 为什么需要配置文件?

Spring Boot 配置文件是一个特殊的文件,用来配置 Spring Boot 应用程序的行为。在 Spring Boot 应用程序中,可以使用多种配置文件格式,包括 properties、YAML、XML 等。配置文件通常包含应用程序的参数、数据库连接等信息,可以让应用程序在不同的环境中运行,例如开发、测试、生产等环境。

项目中重要的信息都是在配置文件中去设置的,例如:

  • 数据库的连接信息,包括用户名和密码等;
  • 项目的启动端口;
  • 第三方系统的调用密钥等信息;
  • 用于发现和定位问题的普通日志和异常日志等。

配置文件的作用在于:

  1. 灵活性:通过配置文件,用户可以根据自己的需求来修改应用程序的参数,而不必修改应用程序的代码。

  2. 维护性:将应用程序的参数存储在配置文件中,可以使得维护者更容易理解应用程序的功能和行为。

  3. 共享性:配置文件可以共享给多个用户或多个应用程序使用,从而降低了编写重复代码的工作量。

  4. 安全性:一些敏感信息如数据库连接字符串、密码等可以单独存储在配置文件中,可以防止这些信息被恶意利用或修改。

Spring Boot常见的配置文件有两种:.properties or .yml, 理论上来说,允许两种格式的配置文件可以同时存在。但是,在实际项目开发中,为了可以更好的维护并降低故障发生的概率,我们通常只使用其中一种格式的配置文件。需要特别注意的是,properties 格式的配置的优先级大于 yml 格式的配置文件。
配置文件01

3 properties 格式的配置文件

properties 的语法是用键值对的形式组织的,key 与 value 之间使用 “=” 连接,并不需要多余的空格或者缩进,示例代码如下:

# 端口配置
server.port=8888

# 数据库连接配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/databaseName?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root

# 自定义配置项
myTestConfigName=Huang

如何读取配置文件?
若想要主动读取配置文件的信息,可以使用@Value 注解,该注解使用${} 格式读取,以下代码演示如何读取上述代码中的自定义配置项 myConfigName=Huang

    @Value("${myTestConfigName}")  // 获取自定义配置项
    private String myTestConfigName;

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

读取配置文件01

对于初学者来说,properties格式的配置文件由于不需要各种缩进和空格的格式控制,因此,可以避免很多错误。但是,properties格式对中文支持并不好,会出现乱码的情况。其次,由于其是key=value形式存储的,会导致代码有很多冗余信息:
冗余信息
要想解决上述问题,可以使用 yml 格式的配置文件解决~

4 yml 格式的配置文件

YAML(全称 Yet Another Markup Language, 另一种标记语言)是一种层级的、非常易读的标记语言。经常用于不同编程语言之间的数据传输。

  • yml 是⼀个可读性⾼,写法简单、易于理解,它的语法和 JSON 语⾔类似。
  • yml ⽀持更多的数据类型,它可以简单表达清单(数组)、散列表,标量等数据形态。它使⽤空⽩符号缩进和⼤量依赖外观的特⾊,特别适合⽤来表达或编辑数据结构、各种配置⽂件等。
  • yml ⽀持更多的编程语⾔,它不⽌是 Java 中可以使⽤在 Golang、PHP、Python、Ruby、JavaScript、Perl 中。

4.1 yml 基本语法

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

使用 yml 格式配置端口号和数据库连接信息的代码如下:

# 优先级 properties > yml 格式, 但是 yml 格式能够解决中文乱码问题, 并且能够适配多种编程语言
server:
  port: 8080

# 数据库连接配置
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/databaseName?characterEncoding=utf8
    username: root
    password: root

相较 properties,代码冗余度降低~

4.2 yml 配置不同类型及null

# 字符串
string.value: Hello

# 布尔值,truefalse
boolean.value1: true
boolean.value2: false

# 整数
int.value1: 77
int.value2: 0b1010_0111_0100_1010_1110 # ⼆进制

# 浮点数
float.value1: 3.14159
float.value2: 314159e-5 # 科学计数法

# Null~代表null
null.value: ~

需要特别注意的是,字符串类型是否带有引号,读取出来是有区别的~

# 字符串
string:
  myString1: 你好, \n世界
  myString2: '你好, \n世界'
  myString3: "你好, \n世界"

读取配置信息的代码如下:

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

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

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

    @PostConstruct
    public void postConstruct() {
    
    
        System.out.println("string.myString1: " + myString01 + "\n" + 
                "string.myString2: " + myString02 + "\n" +
                "string.myString3: " + myString03 + "\n");
    }

读取配置信息
可见,只有带有双引号的字符串,转义字符才能被正常解析。对于无引号和单引号的情况,转义字符会原封不动的打印出来~

4.3 使用 yml 配置对象

在 yml 配置对象示例如下:

# 自定义对象
student:
  id: 1
  name: "黄小黄"
  age: 20

也可以采用行内的写法,作用与上述代码一致:

student: {
    
    id: 1,name: "黄小黄",age: 20}

如果想要主动读取配置对象的信息,则不能使用 @Value 注解,可以采用 @ConfigurationProperties 来读取,具体实现如下:

@Component
@ConfigurationProperties("student")
@Data
public class Student {
    
    
    private int id;
    private String name;
    private int age;
}

在以上代码中,getter、setter以及toString方法均通过lombok实现。需要注意的是@ConfigurationProperties注解中的内容,需要与配置文件中对象的key相同。

调用类的代码如下:

    @Autowired
    private Student student;

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

对象的解析

4.4 使用 yml 配置集合

同样地,使用 yml 配置 list 集合也有两种方式:

dbtypes:
  name:
    - mysql
    - sqlserver
    - db2

行内写法如下:

dbtypes: {
    
    name: [mysql,sqlserver,db2]}

与配置集合相同,也可以采用 @ConfigurationProperties 来读取,具体实现如下:

@Component
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {
    
    

    private List<String> name;
}

调用类的代码如下:

@Component
public class ReadListYml {
    
    

    @Autowired
    private ListConfig listConfig;

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

实现结果

更多系统配置项,请查阅官网:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties


5 Spring Boot读取指定的配置文件

SpringBoot可以读取多个配置文件,其中默认的是application.properties或application.yml。但有时候我们需要读取指定的配置文件,可以通过以下步骤实现:

  1. 创建新的配置文件,比如application-dev.properties或application-dev.yml,可以根据需要命名。

  2. 在src/main/resources目录下创建一个名为config的文件夹。

  3. 将新的配置文件放在config文件夹中。

  4. 在application.properties或application.yml中添加如下配置:

spring.profiles.active=dev

其中dev可以替换成新配置文件的名称(不带扩展名),这样SpringBoot就会加载config文件夹下对应的配置文件。

  1. 在Java代码中可以通过@Value注解获取新配置文件中的属性值,例如:
@Value("${my.property}")
private String myProperty;

其中my.property是新配置文件中的属性名。


写在最后

本文被 JavaEE编程之路 收录点击订阅专栏 , 持续更新中。
 以上便是本文的全部内容啦!创作不易,如果你有任何问题,欢迎私信,感谢您的支持!

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_60353039/article/details/131526529