您好,登录后才能下订单哦!
# SpringBoot从application.properties中注入List和Map方式详解
## 一、引言
在Spring Boot应用开发中,`application.properties`(或`application.yml`)是最常用的配置文件。我们通常会在其中定义一些简单的键值对配置,但实际开发中经常需要处理更复杂的数据结构,比如List(列表)和Map(键值对集合)。本文将深入探讨如何在Spring Boot中从配置文件中注入这两种复杂数据结构。
## 二、基础配置回顾
### 1. 简单属性注入
在开始复杂结构之前,先回顾简单属性的注入方式:
```properties
# application.properties
app.name=MyApplication
app.version=1.0.0
对应的Java类:
@Configuration
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private String name;
private int version;
// getters and setters
}
YAML格式通常更适合表示复杂结构:
# application.yml
app:
name: MyApplication
version: 1.0.0
在.properties文件中配置List有以下几种方式:
app.myList[0]=value1
app.myList[1]=value2
app.myList[2]=value3
app.myList=value1,value2,value3
YAML原生支持列表表示:
app:
myList:
- value1
- value2
- value3
对应的配置类:
@Configuration
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private List<String> myList;
// getter and setter
}
如果List中包含复杂对象:
app:
users:
- name: Alice
age: 25
- name: Bob
age: 30
Java配置类:
public class User {
private String name;
private int age;
// getters and setters
}
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private List<User> users;
// getter and setter
}
app.myMap.key1=value1
app.myMap.key2=value2
app.myMap={key1: 'value1', key2: 'value2'}
app:
myMap:
key1: value1
key2: value2
@Configuration
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private Map<String, String> myMap;
// getter and setter
}
Map的值也可以是复杂对象:
app:
userMap:
user1:
name: Alice
age: 25
user2:
name: Bob
age: 30
Java代码:
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private Map<String, User> userMap;
// getter and setter
}
app:
complexList:
- name: map1
values:
key1: value1
key2: value2
- name: map2
values:
keyA: valueA
keyB: valueB
app:
complexMap:
group1:
- item1
- item2
group2:
- itemA
- itemB
@ConfigurationProperties(prefix = "app")
@Validated
public class AppConfig {
@NotEmpty
private List<String> myList;
@NotNull
private Map<String, String> myMap;
}
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private List<String> myList = Arrays.asList("default1", "default2");
private Map<String, String> myMap = new HashMap<>();
}
解决方案:
- 确保添加了依赖:spring-boot-configuration-processor
- 在主类上添加@EnableConfigurationProperties
解决方案: - 检查属性类型与配置是否一致 - 对于复杂类型,确保有正确的getter/setter
# 包含逗号的值需要用引号括起来
app.specialValues=value1,"value2,with,comma",value3
结合@RefreshScope
实现配置热更新:
@RefreshScope
@ConfigurationProperties(prefix = "app")
public class AppConfig {
// ...
}
不同环境使用不同配置:
# application-dev.yml
app:
myList:
- dev1
- dev2
# application-prod.yml
app:
myList:
- prod1
- prod2
实现自定义类型转换:
@ConfigurationPropertiesBinding
@Component
public class StringToUserConverter implements Converter<String, User> {
@Override
public User convert(String source) {
// 自定义转换逻辑
}
}
@Lazy
延迟初始化本文详细介绍了Spring Boot中从application.properties
或application.yml
注入List和Map的各种方式,包括:
通过灵活运用这些技术,可以更高效地管理Spring Boot应用中的复杂配置,提高代码的可维护性和灵活性。
app:
myList:
- item1
- item2
myMap:
key1: value1
key2: value2
users:
- name: Alice
age: 25
- name: Bob
age: 30
userMap:
user1:
name: Charlie
age: 35
user2:
name: Dana
age: 40
@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "app")
@Validated
public class AppConfig {
private List<String> myList;
private Map<String, String> myMap;
private List<User> users;
private Map<String, User> userMap;
// 省略getters和setters
public static class User {
private String name;
private int age;
// getters and setters
}
}
@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}
通过以上配置,Spring Boot会自动将配置文件中的复杂数据结构绑定到Java对象中,极大简化了配置管理工作。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。