在 Spring Boot 中,YAML 配置文件可以映射到不同类型的 Java 配置类。根据 YAML 配置的不同数据类型,你需要使用相应的 Java 数据类型来进行映射。以下是常见的 YAML 数据类型及其对应的 Java 配置类映射。
YAML 配置类型 | 示例 YAML 配置 | 示例 Java 配置类 |
---|---|---|
字符串、数字、布尔值 |
app: name: "My Application" timeout: 3000 enabled: true |
private String name; private int timeout; private boolean enabled; |
列表、数组 |
app: servers: - "server1.example.com" - "server2.example.com" |
private List<String> servers; private String[] servers; |
映射 (Map) |
app: tokens: -1: "xxxx" -2: "yyyy" |
private Map<String, String> tokens; |
嵌套对象 |
app: database: url: "jdbc:mysql://xxx" username: "user" password: "pass" |
private Database database; public static class Database { ... } |
多层嵌套对象 |
app: server: address: "localhost" port: 8080 ssl: enabled: true certificate: "/path/to/cert" |
private Server server; public static class Server { ... } |
日期和时间 |
app: startDate: "2024-01-01" |
private LocalDate startDate; |
1. 字符串、数字、布尔值
YAML 配置
app:
name: MyApplication
timeout: 3000
maxRetries: 5
enabled: true
Java 配置类
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "app")
@RefreshScope
@Data
public class AppConfig {
private String name;
private int timeout;
private int maxRetries;
private boolean enabled;
}
- 对于字符串,配置可使用引号
"
'
(单引号或双引号)包含。对应java类型是String - 对于数字类型,你可以映射成 int, long, double 等基本数据类型,或者包装类型 Integer, Long, Double 等。
- 布尔值对应的 Java 类型是 boolean 或 Boolean。
使用这些简单类型的如果只有一个值也可以直接使用@Value的方法引入,还可以在@Value中配置中指定默认值,如
@Service
public class OrderService {
@Value("${app.name:defultAppName}")
private String appName;
public void printAppName() {
System.out.println("appName: " +appName);
}
}
2. 列表 (List)、 数组 (Array)
YAML 配置
app:
servers:
- "server1.example.com"
- "server2.example.com"
- "server3.example.com"
Java 配置类
1)使用列表进行映射
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
*
*/
@Component
@ConfigurationProperties(prefix = "app")
@RefreshScope
@Data
public class AppConfig {
private List<String> servers;
}
2)使用数组进行映射
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 使用数组进行映射
*/
@Component
@ConfigurationProperties(prefix = "app")
@RefreshScope
@Data
public class AppConfig {
private String[] servers;
}
- 当配置为多项时,可以使用列表
List<String>
,或者数组String[]
进行映射。
3. Map
YAML 配置
app:
tokens:
1: "xxxx"
2: "yyyy"
Java 配置类
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
*
*/
@Component
@ConfigurationProperties(prefix = "app")
@RefreshScope
@Data
public class AppConfig {
private Map<String, String> tokens;
}
- 对应的 Java 类型是
Map<K, V>
,其中K
和V
分别是键和值的类型。
4. 嵌套对象 (Nested Objects)
YAML 配置
app:
database:
url: "jdbc:mysql://localhost:3306/mydb"
username: "user"
password: "pass"
xxx:
xx: 123
Java 配置类
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
*
*/
@Component
@ConfigurationProperties(prefix = "app")
@RefreshScope
@Data
public class AppConfig {
private Database database;
private Xxx xxx;
@Data
public static class Database {
private String url;
private String username;
private String password;
}
@Data
public static class XXX{
private String xx;
}
}
- 对应的 Java 类型是一个嵌套类或一个独立的 Java Bean 类。
- Spring Boot 会自动将嵌套的 YAML 配置映射到 Java 类的嵌套对象。
5. 多层嵌套对象 (Nested Objects with Multiple Levels)
YAML 配置
app:
server:
address: "localhost"
port: 8080
ssl:
enabled: true
certificate: "/path/to/cert"
Java 配置类
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
*
*/
@Component
@ConfigurationProperties(prefix = "app")
@RefreshScope
@Data
public class AppConfig {
private Server server;
@Data
public static class Server {
private String address;
private int port;
private Ssl ssl;
@Data
public static class Ssl {
private boolean enabled;
private String certificate;
}
}
}
}
- 对应的 Java 类型是多层嵌套的 Java 类。
- Spring Boot 支持多级嵌套的配置映射到对应的 Java 对象。
6. 日期和时间 (Date, LocalDate, LocalDateTime...)
YAML 配置
app:
startDate: "2025-01-01"
Java 配置类
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
/**
*
*/
@Component
@ConfigurationProperties(prefix = "app")
@RefreshScope
@Data
public class AppConfig {
private LocalDate startDate;
}
- Spring Boot 可以自动将 YAML 中的日期和时间字符串映射到 java.time.LocalDate, LocalDateTime, Instant 等类型。