SpringBoot 复杂配置信息读取

前言

本文接上一篇博客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 receiverSASMap;

        // Setters and getters ...
    }

    private Map subtype;

    // Setters and getters.
}

这里需要解释下@ConfigurationProperties修饰的bean中map类型成员变量如何灵活运用。

复杂属性匹配不容易理解的地方在于Map的变量名,key和value是怎么对应到properties上的。对于value类型为简单类型的map而言:

Map demoMap;

对应的属性文件为:

# key1和key2会被映射为demoMap的key值
prefix.demoMap.key1=value1
prefix.demoMap.key2=value2

其中prefix@ConfigurationProperties中prefix的值。

如果Map中value的类型为复杂类型(bean, list或map):

Map 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

你可能感兴趣的:(SpringBoot 复杂配置信息读取)