Spring Boot中yaml配置文件使用的一些总结

最近在spring boot项目中用到了yaml文件来作为conf配置,中间踩了一些坑,这里记录一下:

1. 自定义yaml配置的加载

首先,我的新增配置不在application.yaml 文件中,是单独拆出来放在子目录下的配置,首要任务是需要spring boot能够找到并成功加载,这里需要用到一个方法:

@Configuration
public class ConfManager {
     

    @Bean
    public static PropertySourcesPlaceholderConfigurer serviceConfig() {
     
        PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
        YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
        yaml.setResources(new ClassPathResource("config1.yaml"),
                new ClassPathResource("subdir/config2.yaml"));
        configurer.setProperties(yaml.getObject());
        return configurer;
    }

}

如果有多个conf文件,只需要在setResources方法里面增加ClassPathResource的个数即可。
需要注意的是,spring中只能定义一个@Bean修饰的PropertySourcesPlaceholderConfigurer,在注入一个后不再扫描其他的configurer,如果注入多个会出现注入bean为null的情况。

2. @Value 注入方式

spring启动时,如果被@Component修饰的class中有@Value 修饰的成员,那么该成员会按照yaml配置中定义的path进行value注入。

a:
    b:
        c: value
@Component
class TestClass {
    @Value("${a.b.c}")
    private String c;
}

但我想说的不是这个,而是当定义一个 Map 或 List 的配置时,使用这种方式是不会注入成功的,看下面一个例子:

xxx-config:
  enable: false
  id: 1
  maps:
    shard1:
      - group01
      - group04
      - group07
    shard2:
      - group02
      - group05
      - group08
    shard3:
      - group03
      - group06
      - group09

用@Value注解注入maps变量

@Component
class TestClass {
     
    @Value("${xxx-config.maps}")
    Map<String, List<String>> maps;
}

会出现:

Could not resolve placeholder 'xxx-config.maps' in string value "${xxx-config.maps}"

这样的报错,解决的方式是换一种姿势

@Data
@Component
@ConfigurationProperties(prefix = "xxx-config")
public class ShardConfig {
     

    boolean enable;

    int id;

    Map<String, List<String>> maps;

}

然后

@Component
class TestClass {
     
    @Resource
    private ShardConfig shardConfig;
}

你可能感兴趣的:(Java,java,spring,boot,yaml)