配置注入机制

配置注入提供了一种简单的管理大量复杂配置的机制,开发者不需要使用 DynamicPropertyFactory 逐个读取配置项,增加配置监听, 而是定义一个简单的 JAVA Bean, 定义这个 Bean 的属性对应的配置项, 当配置信息变化的时候, Bean 的属性会自动刷新,极大 的简化了用户管理大量复杂配置的复杂度。

Bean 属性对应的配置项名称支持通配符, 一个属性可以关联若干配置项,可以声明这些配置项的优先级。 Java对象可以是一个 Java Bean,或是一个拥有public字段的类。

配置注入对象

我们首先设计两个Java类用于注入配置属性,分别用来演示不使用注解和使用注解的场景。

  1. /*
  2. 使用ServiceComb注解
  3. */
  4. @InjectProperties(prefix = "root") //指定该model关联的配置属性的前缀
  5. public class ConfigWithAnnotation {
  6. /*
  7. 此处的prefix属性值"override"会覆盖标注在类定义的@InjectProperties注解的prefix属性值"root",keys属性可以为一个字符串数组并且数组元素下标越小优先级越高
  8. 这里会按照如下顺序的属性名称查找配置属性,直到找到已被配置的配置属性,则停止查找:
  9. 1)override.high
  10. 2)override.low
  11. */
  12. @InjectProperty(prefix = "override", keys = {"high", "low"})
  13. public String strValue;
  14. //keys支持通配符,并在可以在将配置属性注入的时候指定通配符的代入对象。
  15. @InjectProperty(keys = "${key}.value")
  16. public int intValue;
  17. //通配符的代入对象可以是一个字符串List,优先级遵循数组元素下标越小优先级越高策略
  18. @InjectProperty(keys = "${full-list}")
  19. public float floatValue;
  20. //keys属性也支持多个通配符,优先级如下:首先通配符的优先级从左到右递减,然后如果通配符被代入List,遵循List中元素index越小优先级越高策略。
  21. @InjectProperty(keys = "${low-list}.a.${high-list}.b")
  22. public long longValue;
  23. //可以通过注解的defaultValue属性指定默认值。如果字段未关联任何配置属性,定义的默认值会生效,否则默认值会被覆盖
  24. @InjectProperty(defaultValue = "abc")
  25. public String strDef;
  26. }
  1. /*
  2. 不使用ServiceComb注解
  3. */
  4. public class ConfigNoAnnotation {
  5. /*
  6. 如果未提供@InjectProperties和@InjectProperty注解,会默认使用字段名作为配置属性名。注意类名不作为前缀起作用。
  7. 此处将配置属性 strValue 绑定到该字段
  8. */
  9. public String strValue;
  10. }

执行注入

我们可以通过以下示例代码来执行注入:

将配置属性注入到无@InjectProperties@InjectProperty注解的对象上:

  1. ConfigNoAnnotation config = SCBEngine.getInstance().getPriorityPropertyManager().createConfigObject(ConfigNoAnnotation.class);

将配置属性注入到有@InjectProperties@InjectProperty注解的对象上:

  • 将名称为root.k.value的配置属性注入到一个ConfigWithAnnotation对象的intValue字段

  • ConfigWithAnnotation对象的longValue字段按以下顺序查找已配置的配置属性进行注入:

  • root.low-1.a.high-1.b

  • root.low-1.a.high-2.b
  • root.low-2.a.high-1.b
  • root.low-2.a.high-2.b

  • ConfigWithAnnotation对象的floatValue字段按以下顺序查找已配置的配置属性进行注入:

  • root.l1-1

  • root.l1-2
  1. ConfigWithAnnotation config = SCBEngine.getInstance().getPriorityPropertyManager()
  2. .createConfigObject(ConfigWithAnnotation.class,
  3. "key", "k",
  4. "low-list", Arrays.asList("low-1", "low-2"),
  5. "high-list", Arrays.asList("high-1", "high-2"),
  6. "full-list", Arrays.asList("l1-1", "l1-2")
  7. );

如果配置实例是临时的,需要显式地回收配置注入对象。

  1. priorityPropertyManager.unregisterConfigObject(config)

更多关于配置注入的用法,建议下载 java-chassis 的源码, 查看 TestConfigObjectFactory 类里面的示例。