Java 配置服务。。使用XML(而不是属性)

Java 配置服务。。使用XML(而不是属性),java,xml,osgi,bnd,Java,Xml,Osgi,Bnd,我有一个(带bnd注释的)组件,它实现了一个简单的api,并将自己作为服务公开 package com.mycompany.impl; import com.mycompany.api.IFoo; @Component(designateFactory=FooImpl.Configuration.class) class FooImpl implements IFoo { interface Configuration { String foo(); // .. }

我有一个(带bnd注释的)组件,它实现了一个简单的api,并将自己作为服务公开

package com.mycompany.impl;
import com.mycompany.api.IFoo;

@Component(designateFactory=FooImpl.Configuration.class)
class FooImpl implements IFoo {

  interface Configuration {
    String foo();
    // ..
  }

  Configuration configuration;

  @Activate
  public void activate(Map properties) {
    configuration = Configurable.createConfigurable(Configuration.class, properties);
    // ..
  }

} 
它的配置由Felix FileInstall从一个监视目录加载,服务由Felix配置服务实例化(至少,我假设这就是发生的事情——我是OSGi新手,请记住),这一点,使用生成的元类型描述符工作得很好

然而,就目前而言,FooImpl需要结构化配置(列表列表、列表映射等),我想知道是否有一种优雅的(*)方法可以通过类似的工作流配置组件实例;也就是说,配置发现和实例化/部署仍然是集中的

在我看来,配置服务规范管理映射——我是否必须推出自己的配置服务&FileInstall,以便能够使用xml/json/yaml支持的结构化配置呈现组件

  • 比如说,与在属性中定义xml配置文件的位置相对的是…confiception?我自己分析
是和否

OSGi配置管理服务处理基于平面映射的抽象配置记录(实际上是
java.util.Dictionary
,但本质上是一样的)。Config Admin不知道任何有关底层物理存储的信息;它总是依赖其他人调用
ConfigurationAdmin
服务上的方法,即
getConfiguration
createFactoryConfiguration

调用Config Admin的“其他人”通常称为“管理代理”。Felix FileInstall是一个非常简单的管理代理示例,它读取Java属性格式的文件。实际上文件安装可能太简单,我不认为它适合于生产部署——但这是一个单独的讨论。

听起来您想编写自己的管理代理来读取XML文件,并将它们输入到配置管理中。这真的不是一个大的或困难的任务,你不应该害怕承担它。Config Admin的设计假设应用程序对配置数据存储的需求非常多样化,因此大多数应用程序必须编写自己的简单管理代理,这就是为什么它不定义自己的存储格式或位置


但是,一旦管理代理读取了配置数据,就必须将其作为映射/字典传递到Config Admin,而Config Admin又会将其作为映射传递给组件。因此,组件本身不接收高度结构化的数据,例如树或嵌套地图。不过也有一些灵活性:配置属性可以包含基于类型的列表;您也可以使用枚举值等。

谢谢。那么,物理存储中是否存在值类型限制(FileInstall仅处理属性文件)?看起来ConfigurationAdmin接口将使用任何字典-我不知道如何/在何处强制执行字符串键限制(如果严格遵守规范,值类型将限制为OSGi主属性类型;请参见标题为“主属性类型”的图)在OSGi核心规范的第3.2.7节中。是的,键必须是字符串(OSGi概要,第104.4.3节)。它应该是
字典
,但该规范早于Java 5泛型。