springboot从application.properties中注入list和map方式是什么

发布时间:2021-12-17 16:21:37 作者:iii
来源:亿速云 阅读:347
# 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
}

2. YAML与Properties格式对比

YAML格式通常更适合表示复杂结构:

# application.yml
app:
  name: MyApplication
  version: 1.0.0

三、List类型注入方式

1. Properties格式配置List

在.properties文件中配置List有以下几种方式:

方式一:索引方式

app.myList[0]=value1
app.myList[1]=value2
app.myList[2]=value3

方式二:逗号分隔

app.myList=value1,value2,value3

2. YAML格式配置List

YAML原生支持列表表示:

app:
  myList:
    - value1
    - value2
    - value3

3. Java代码实现

对应的配置类:

@Configuration
@ConfigurationProperties(prefix = "app")
public class AppConfig {
    private List<String> myList;
    // getter and setter
}

4. 复杂对象List

如果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
}

四、Map类型注入方式

1. Properties格式配置Map

方式一:嵌套属性

app.myMap.key1=value1
app.myMap.key2=value2

方式二:内联方式

app.myMap={key1: 'value1', key2: 'value2'}

2. YAML格式配置Map

app:
  myMap:
    key1: value1
    key2: value2

3. Java代码实现

@Configuration
@ConfigurationProperties(prefix = "app")
public class AppConfig {
    private Map<String, String> myMap;
    // getter and setter
}

4. 复杂值Map

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
}

五、混合复杂结构

1. List中包含Map

app:
  complexList:
    - name: map1
      values: 
        key1: value1
        key2: value2
    - name: map2
      values: 
        keyA: valueA
        keyB: valueB

2. Map中包含List

app:
  complexMap:
    group1:
      - item1
      - item2
    group2:
      - itemA
      - itemB

六、验证与默认值

1. 使用@Valid验证

@ConfigurationProperties(prefix = "app")
@Validated
public class AppConfig {
    
    @NotEmpty
    private List<String> myList;
    
    @NotNull
    private Map<String, String> myMap;
}

2. 设置默认值

@ConfigurationProperties(prefix = "app")
public class AppConfig {
    private List<String> myList = Arrays.asList("default1", "default2");
    private Map<String, String> myMap = new HashMap<>();
}

七、最佳实践与常见问题

1. 最佳实践

  1. 优先使用YAML:对于复杂结构,YAML格式更清晰易读
  2. 明确前缀:确保@ConfigurationProperties的prefix清晰明确
  3. 使用IDE支持:利用IDE的自动补全和验证功能
  4. 合理分组:相关配置应放在同一个配置类中

2. 常见问题解决

问题1:注入失败

解决方案: - 确保添加了依赖:spring-boot-configuration-processor - 在主类上添加@EnableConfigurationProperties

问题2:类型不匹配

解决方案: - 检查属性类型与配置是否一致 - 对于复杂类型,确保有正确的getter/setter

问题3:特殊字符处理

# 包含逗号的值需要用引号括起来
app.specialValues=value1,"value2,with,comma",value3

八、高级用法

1. 动态刷新配置

结合@RefreshScope实现配置热更新:

@RefreshScope
@ConfigurationProperties(prefix = "app")
public class AppConfig {
    // ...
}

2. 多环境配置

不同环境使用不同配置:

# application-dev.yml
app:
  myList:
    - dev1
    - dev2

# application-prod.yml
app:
  myList:
    - prod1
    - prod2

3. 自定义转换器

实现自定义类型转换:

@ConfigurationPropertiesBinding
@Component
public class StringToUserConverter implements Converter<String, User> {
    @Override
    public User convert(String source) {
        // 自定义转换逻辑
    }
}

九、性能考虑

  1. 避免过度配置:只注入必要的配置
  2. 缓存配置:对于频繁访问的配置考虑缓存
  3. 延迟加载:使用@Lazy延迟初始化

十、总结

本文详细介绍了Spring Boot中从application.propertiesapplication.yml注入List和Map的各种方式,包括:

  1. 基本语法和多种配置格式
  2. 简单和复杂数据结构的处理
  3. 验证和默认值设置
  4. 最佳实践和常见问题解决方案
  5. 一些高级用法和性能考虑

通过灵活运用这些技术,可以更高效地管理Spring Boot应用中的复杂配置,提高代码的可维护性和灵活性。

附录:完整示例代码

1. application.yml

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

2. 完整配置类

@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
    }
}

3. 主类示例

@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}

通过以上配置,Spring Boot会自动将配置文件中的复杂数据结构绑定到Java对象中,极大简化了配置管理工作。 “`

推荐阅读:
  1. java中map和list的区别是什么
  2. SpringBoot中有哪些注入数据的方式

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springboot map list

上一篇:如何复现Tomcat样列目录session操控漏洞

下一篇:如何进行springboot配置templates直接访问的实现

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》