前言
本文接上一篇博客Spring Boot读取配置文件自定义信息
以上场景适用于比较简单的属性文件。然而,在实际工作中我们会需要这样的配置:配置文件的key中也包含有变量信息。如下所示:
tran.subtype.交易子类型.id=xxx
tran.subtype.交易子类型.infoTableName=xxx
tran.subtype.交易子类型.msgTemplate=xxx
tran.subtype.交易子类型.receiverSASMap.字段名=SAS结果映射值
这里支持配置多种交易子类型,并分别指定id, infoTableName和msgTemplate属性的值。此外,还有一个map类型的配置:receiverSASMap。该map用于配置SAS规则引擎返回结果和数据库表字段的对应关系。即在properties文件的key中存在两个变量:上图中的交易子类型
和字段名
。
实际的属性文件如下所示:
tran.subtype.toUser.id=0001
tran.subtype.toUser.infoTableName=Table1
tran.subtype.toUser.receiverSASMap.RETAILER_INFO=1,2
tran.subtype.toUser.receiverSASMap.BRANCH_INFO=2
tran.subtype.toUser.msgTemplate=ABCtoUser
tran.subtype.toPublic.id=0002
tran.subtype.toPublic.infoTableName=Table2
tran.subtype.toPublic.receiverSASMap.RETAILER_INFO=3,4
tran.subtype.toPublic.receiverSASMap.BRANCH_INFO=5
tran.subtype.toPublic.msgTemplate=DEFtoPublic
我们如何编写可以承载此类信息的bean呢?
Bean的编写
@Component
@ConfigurationProperties(prefix = "tran")
public class TranConfigBean {
public static class Type {
private String id;
private String infoTableName;
private String msgTemplate;
private Map<String, String> receiverSASMap;
// Setters and getters ...
}
private Map<String, Type> subtype;
// Setters and getters.
}
这里需要解释下@ConfigurationProperties
修饰的bean中map类型成员变量如何灵活运用。
复杂属性匹配不容易理解的地方在于Map的变量名,key和value是怎么对应到properties上的。对于value类型为简单类型的map而言:
Map<String, String> demoMap;
对应的属性文件为:
# key1和key2会被映射为demoMap的key值
prefix.demoMap.key1=value1
prefix.demoMap.key2=value2
其中prefix
为@ConfigurationProperties
中prefix的值。
如果Map中value的类型为复杂类型(bean, list或map):
Map<String, Student> demoMap;
// ...
public static class Student {
private Integer id;
private String name;
// setters and getters
}
对应的属性文件为:
# key1和key2会被映射为demoMap的key值
prefix.demoMap.key1.id=001
prefix.demoMap.key1.name=paul
prefix.demoMap.key2.id=002
prefix.demoMap.key2.name=peter
总结
如果在properties文件配置项的key中使用变量的话,需要在对应的bean内定义map。属性文件的书写规则为:
prefix.mapName.keyN=valueN
前缀.map名称.keyN=valueN