springboot yml读取List、Map

springboot yml读取List、Map

yml配置文件内容

data:
  lists:
    - "001"
    - "002"
  maps:
    "[key1]": "value1"
    "[key2]": "value2"

配置类

@Configuration
@ConfigurationProperties(prefix = "data")
@Data
public class DataListConfig {
    private List<String> lists;

    private Map<String, String> maps;
}

使用

public class TestController {
   
    @Autowired
    private DataListConfig dataListConfig;

    @GetMapping
    public String test() {
        System.out.println(dataListConfig.getLists());
        return "6666";
    }
}

最后

使用map时,key最好都加上[],因为如果key包含除小写字母、数字字符或-以外的任何字符,不加上[],key的值会缺失,比如key原始值是"zhang三",不加[]的话key可能读到的是"zhang"。
忘记在官网还是stackoverflow看过说明,如下:

When binding to Map properties, if the key contains anything other than lowercase alpha-numeric characters or -, you need to use the bracket notation so that the original value is preserved. If the key is not surrounded by []

### Spring Boot 中读取外部 YAML 文件的方法 #### 使用 `@PropertySource` 注解配合 `YamlPropertySourceFactory` 为了使应用程序能够从外部位置加载 `.yml` 配置文件,在启动类或其他配置类上可以使用 `@PropertySource` 注解,并指定自定义的 `YamlPropertySourceFactory` 来处理 YAML 文件。这允许程序灵活地指向任意路径下的配置文件。 ```java @Configuration public class AppConfig { @Bean public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() { return new PropertySourcesPlaceholderConfigurer(); } @Bean public YamlPropertySourceLoader yamlPropertySourceLoader(){ return new YamlPropertySourceLoader(); } } ``` 对于上述代码片段,还需要创建一个工厂类实现 `PropertySourceFactory` 接口以便正确解析 YAML 文件[^1]: ```java import org.springframework.core.io.support.DefaultPropertySourceFactory; import org.springframework.core.io.support.EncodedResource; import java.util.List; import java.util.Map; public class YamlPropertySourceFactory extends DefaultPropertySourceFactory { @Override protected Object createPropertySource(String name, EncodedResource resource) throws IOException { List<org.yaml.snakeyaml.Yaml> list = loadYamls(resource); Map<String,Object> sourceMap = (Map)((List<Map>)list.get(0)).get(0); return new Properties(name,sourceMap); } private List<org.yaml.snakeyaml.Yaml> loadYamls(EncodedResource encodedResource)throws FileNotFoundException{ try(InputStream inputStream=encodedResource.getInputStream()){ Yaml yaml=new Yaml(new Constructor(Map.class)); return yaml.loadAll(inputStream); } } } ``` 接着可以在需要的地方注入相应的属性值,比如通过 `@Value("${property.key}")` 或者利用 `@ConfigurationProperties` 绑定整个对象到特定前缀下的一组配置项[^3]。 当涉及到更复杂的场景时,如多环境部署或多模块共享同一套基础配置的情况下,则推荐采用第二种更为简洁高效的方式——即直接在 `application.yml` 中声明外部资源的位置并启用它作为默认配置源之一[^2]。 #### 利用命令行参数或系统变量覆盖内部配置 除了硬编码设定外,还可以借助 JVM 启动选项 `-Dspring.config.location=file:/path/to/your/application.yml` 动态改变配置文件所在目录;这种方式特别适用于容器化环境中传递敏感信息而不必将其暴露于版本控制系统内[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值