application.yml中的Map嵌套
你好,如果你在为无法使用
@ConfigurationProperties
注解完成
Map<String, List<String>>
的自动装配而烦恼,请看这篇文章,希望对你有所帮助!
配置部分
我们使用的是Spring Boot,遵循约定大于配置的理念,故在配置前你得了解它们是如何约定好的。我们首先需要在实体配置对象Properties.java
处讲好是从yml的哪个前缀后开始扫描读取,然后在application.yml
文件定义好数据映射关系,最后在Spring主程序入口处让我们使用了@ConfigurationProperties
注解的类生效。
application.yml部分
首先我们要清楚@ConfigurationProperties
注解可以使用(prefix = "xxx")
这样来筛选前缀来自动装配数据,而成员变量名则对应前缀之下的yml标记语言,列表或数组可以用[]方括号来表示,则可以以下为例:
# 分布式数据源关联映射 Map<String, List<String>>
source:
# 成员变量名
sources:
# 键值对
intouch: [intouch-master,intouch-slave]
power-top: [power-top-master,power-top-slave]
power-bottom: [power-bottom-master,power-bottom-slave]
Properties.java部分
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.annotation.Validated;
import java.util.List;
import java.util.Map;
@Configuration
@ConfigurationProperties(prefix = "source")
@Validated
@Data
public class SourcesProperties {
private Map<String, List<String>> sources;
}
Application.java部分
@EnableScheduling
@SpringBootApplication(scanBasePackages = "xxx.xxx.**")
@EnableConfigurationProperties({
SourcesProperties.class
})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
如何使用
既然是在spring项目中使用,就需要理解清楚Properties.java
类对象需要被严格控制它的使用,是不希望被其他对象依赖注入后修改其内部属性的。所以我们的使用方式应使用final
来限定
ServiceImpl.java部分
@Service
public class DataCollectionServiceImpl implements DataCollectionService {
private final SourcesProperties sourcesProperties;
@Autowired
public DataCollectionServiceImpl(SourcesProperties sourcesProperties) {
this.sourcesProperties = sourcesProperties;
}
public void show(){
sourcesProperties.getSources().forEach((k,v) -> {
System.out.println(k + ":" + v);
});
}
}
运行日志: