【仅供内部供应商使用,不提供对外解答和培训】

Page tree

【仅供内部供应商使用,不提供对外解答和培训】

Skip to end of metadata
Go to start of metadata

1.简单几句话来概括一下配置读写的方案:

(1)每个单例的配置类都需要配置该配置类的所在的空间,可以提供一个的getNameSpace() 方法,配置类中的所有需要存储的成员变量需要用根据成员变量的不同,选取不同的Conf实现。

(2)每个Conf有两个属性,namespace表示该Conf所在的父空间,property表示该Conf在父空间下的唯一标识。 Conf首先根据父空间和唯一标识从数据库中读取相应的数据,然后根据Conf的类型使用不同的方式,将这些数据生成相应的对象,设置在

Conf中。如果被包装的类型是对象,则这个对象中成员变量也需要用Conf来包装。  可以这样理解,Conf只是用来存储被包装的对象的一些元数据信息,根据这些元数据信息,可以从数据库中读取一些数据,然后重新组装被包装的对象。

(3)如果被包装的类型是集合类型,那么Conf.get()获取到的是一个不可变的集合。所有修改集合的操作,需要委托MapHolder和CollectionHolder或者SimpleCollectionHolder的方法来修改。

(4)要仔细区分ColConf,MapConf,和ObjectColConf与ObjectMapConf。 ColConf包装的集合中的元素为基本类型,String,一些简单的枚举类型。MapConf包装的的Map的key和value是基本类型,String等一些简单的类型。

ObjectMapConf包装的Map的key为基本类型或者String类型,value是我们报表的业务对象(这个对象所在的类需要继承UniqueKey,并且类中的成员变量也需要按照规则用Conf包装)。ObjectColConf包装的集合中的元素是我们报表的业务对象,同样这个对象所在的类需要继承UniqueKey,并且类中的成员变量也需要按照规则用ColConf包装。

2.配置类限制

(1)所有的配置类都是单例

  配置类单例的写法统一修改为如下方式:

 public static Config getInstance() {
if (config == null) {
config = ConfigContext.getConfigInstance(Config.class);
}
return config;
}

(2)配置类都需要继承Configuration,需要实现getNameSpace()方法来标识配置类唯一标识。配置类中的成员变量如果是 对象,这个对象需要继承UniqueKey,UniqueKey提供了getNameSpace()的实现。

3.配置改变监听接口

背景:有些业务对象依赖配置进行构建,但是这个业务对象的构建是个十分耗时的操作,因此这些业务对象需要监听配置文件的变化,重新构建。因此提供配置监听接口。

//需要实现配置监听的业务对象实现这个接口,accept方法用来 gaos
public interface ConfigChangeListener {
    //哪些Config的修改会触发change()函数
    boolean accept(Class<? extends Configuration> configClass);

    void change();
}
 
注册接口
ValidateProxy.getInstance().getValidateManager().registerListener(listener);
  • No labels