springboot去读yml配置文件中的属性值

时间:2025-04-04 07:04:23

springboot去读yml配置文件中的属性值

  • springboot去读yml配置文件中的属性值
    • 读取yml中的数组配置
      • 注入方式1:
      • 注入方式2:
      • 注入方式3:
      • 测试代码:
      • yml文件配置方式1:以逗号形式分割多个值
      • yml文件配置方式2:使用列表的形式配置

springboot去读yml配置文件中的属性值

读取yml中的数组配置

注入方式1:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = "my")
public class MyProperties {
    private String[] array;

}

注入方式2:

【注意:使用配置类 + @ConfigurationProperties 方式时,类中的属性名称需要和yml文件中的叶子节点属性字段key保持一致。yml中的中划线会指定映射成 Bean 对象的 驼峰。例如:yml中 district-code,会自动映射到java类中的 districtCode 属性上】

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;

@Data
@Component
@ConfigurationProperties(prefix = "my")
public class MyProperties2 {
    private List<String> array;
}

注入方式3:

在spring容器管理的类里使用@value注解注入yml中属性值

 @Value("#{'${my.array}'}") // 注意这里的单引号和花括号的使用
 private List<String> myArray;

或者

 @Value("${my.array}")
 private List<String> syncDataDistrictCodes;

以上两种没有默认值,如果yml中没有配置,程序启动时会报错:

Could not resolve placeholder 'my.array' in value "#{'${my.array}'}"

再或者(注意这里边带冒号,冒号后边指定默认值,如果只写了个冒号,没有指定默认值,List注入的是 空的列表,不是null)

 @Value("${my.array:}")
 private List<String> syncDataDistrictCodes;

测试代码:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("test")
public class TestController {

    @Value("#{'${my.array}'}") // 注意这里的单引号和花括号的使用
    private List<String> myArray;

    @Resource
    private MyProperties myProperties;
    @Resource
    private MyProperties2 myProperties2;

    @GetMapping("/getConfig")
    public Object getConfig() {
        Map<String, Object> resMap = new LinkedHashMap<>();
        resMap.put("@value注入", myArray);
        resMap.put("配置类注入myProperties-myArray", myProperties.getArray());
        resMap.put("配置类注入myProperties2-strList", myProperties2.getArray());
        return resMap;
    }
}

yml文件配置方式1:以逗号形式分割多个值

my:
  array: value1,value2,value3

请求测试接口输出结果:

{
    "@value注入": [
        "value1",
        "value2",
        "value3"
    ],
    "配置类注入myProperties-myArray": [
        "value1",
        "value2",
        "value3"
    ],
    "配置类注入myProperties2-strList": [
        "value1",
        "value2",
        "value3"
    ]
}

总结:三种注入方式均可正常注入

yml文件配置方式2:使用列表的形式配置

my:
  array:
    - value1
    - value2
    - value3

注入方式3的代码加上后,项目无法启动,报错:

Could not resolve placeholder 'my.array' in value "#{'${my.array}'}"

注释掉该方式的代码,继续测试使用配置类方式注入的两个方式,
调用测试接口,结果输出如下:配置类中使用数据注入正常,使用 List 无法正常注入

{
    "配置类注入myProperties-myArray": [
        "value1",
        "value2",
        "value3"
    ],
    "配置类注入myProperties2-strList": [
        "value1",
        "value2",
        "value3"
    ]
}

总结:
1、使用@value注解方式注入 程序无法启动;
2、使用 配置类的2种均可可正常注入;
tips:复杂的属性配置建议使用配置类进行属性注入