【问题标题】:control instantiation of osgi declarative service控制 osgi 声明式服务的实例化
【发布时间】:2013-09-20 07:08:19
【问题描述】:

我正在寻找一种简单的方法来控制声明式服务的实例化。

我想要的是一个类似于工厂的东西,它被要求返回一个组件的实例,但我可以在其中控制实例化。

目前我刚刚找到了可以使用给定字典调用 newInstance 的 ComponentFactory。但我真正想要的是这样的,假设 IComponent 是声明式服务接口,而 MyComponent 是实现类

public class MyComponentFactory implements ? {

   public IComponent newInstance() {
       return new MyComponent("firstParameter", "secondParameter");
   }
}

声明式服务是否有类似的可能,还是我需要在捆绑激活码中使用我自己的服务注册?

提前致谢

【问题讨论】:

  • 谁控制实例化?即,谁会打电话给newInstance?服务消费者?或者您希望框架自动执行此操作;如果是这样,那么在什么时间/事件?
  • 框架应该在需要服务实例时自动完成。即,服务使用者向 OSGI 服务注册表请求服务“IComponent”。
  • 但这就是 DS 已经做到的。它根据服务消费者的第一个需求创建组件。
  • 我知道,那是我的问题。框架强制使用 0 参数构造函数。我认为可能有一种解决方法,因此框架说:“我需要一个新组件,我将实例委托给你的特殊类”
  • 客户端+字典有什么问题?或者,如果这些参数是静态编码的,为什么不将它们移动到调用参数化构造函数的零参数构造函数?

标签: java osgi factory declarative-services


【解决方案1】:

DS 不提供您正在寻找的实例创建间接级别。 DS 会一直使用公共的无参数构造函数,然后调用指定的激活器方法来完成实例初始化。

【讨论】:

  • 所以看起来对于组件的 n-arg 构造函数来说是不可能的
  • 没错。 DS 不支持构造函数注入。它支持激活、修改和停用方法来注入配置和绑定和取消绑定方法来注入依赖项。
【解决方案2】:

这种服务实例化控制的一种替代方法是使用 DS 和 CM 的组合。

您必须在 DS xml 中设置 configuration-policy="require" 并使用 CM 创建一个配置实例,该实例将用于将包含您需要的所有属性(当然只有 DS 支持的类型)的 Dictionary 传递给创建的服务实例。您甚至可以为该配置使用属性文件和 Felix 文件安装。

如果这还不够,您还有另一种选择,即在使用 CM 添加配置后跟踪新创建的服务并调用 setup(args) 方法。

【讨论】:

    猜你喜欢
    • 2012-04-27
    • 1970-01-01
    • 2018-05-20
    • 2013-10-09
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    相关资源
    最近更新 更多