0

我有一个用于 DI 的Swing项目Spring,现在我正在尝试迁移Eclipse 4OSGi.
使用Spring用户的配置文件可以注释/取消注释 bean 以添加/删除功能(由这些后端 bean 提供)。
现在我正在寻找Eclipse基于. 我知道我可以将 bean 作为服务并在其中定义启动级别,但这并不能解决我的用例,即: 应用程序在没有运行这些 bean/模块的情况下启动,并且如果用户从正在运行的 UI 更新配置这些 bean/模块启动,它们也会在应用程序的下一次启动时启动。OSGiOSGi
OSGi

我的问题有一个很好/干净的方法吗?

4

4 回答 4

2

您可能想要使用Eclipse Gemini Blueprint来管理 Spring 和 OSGi 之间的所有集成方式(Gemini Blueprint 是 Spring Dynamic Modules 的继承者)。特别是,它几乎可以为您处理与动态服务注册相关的所有复杂性;你的豆子可以保持几乎相同。

于 2012-10-22T10:19:58.623 回答
1

另一种方法是将声明式服务与配置管理一起使用,让配置数据确定要激活哪些服务。在这里更详细

于 2012-10-22T12:40:36.077 回答
0

就像您已经发现服务是解决此问题的好方法一样。只需安装所有模块,但不要启动它们。然后,您的 UI 可以在用户选择他想要的功能时启动和停止模块。然后,OSGi 框架会在重新启动时记住已安装和启动的模块。

于 2012-10-22T06:43:01.227 回答
0

绝对最好的方法是声明式服务 (DS)。DS 与 OSGi 的配置管理集成,使得控制服务实例的数量以及它们的配置和服务属性变得微不足道。例如,以下组件(带有 bnd 注释 [很快将类似于 OSGi 规范中的类似功能]):

    @Component(designateFactory=Config.class)
    public MyComp implements MyService {
       interface Config {
         int port();
         String host();
      }
      Config config;
      @Activate
      void activate(Map<String,Object> map) {
        config = Configurable.createConfigurable(Config.class,map);
        start();
      }

      void foo() { ... do the MyService stuff ... }

      @Reference
      void setDataSource( DataSource ds ) { ... }
   }

此组件需要 Configuration Admin出厂配置。了解其功能的最佳方式是使用 Apache Felix Webconsole 设置框架。告诉bnd在包designateFactory=Config.class中创建一个元类型XML 文件。Webconsole 使用它来为配置数据创建一个漂亮的表单,从接口及其方法派生。此表单可识别类型,即您不能为端口号输入非数字值。通过 web 控制台,您现在可以通过创建多个工厂配置来实例化多个组件。删除这些出厂配置会删除服务。在您的应用程序中,您可以在用户的​​控制下自己操作 Configuration Admin。

另一个优点是通过 Configuration Admin 你可以控制组件依赖的绑定。在上述示例中,您可以将dataSource.target属性设置为过滤器,例如(db=accounting)选择会计数据库。所有配置属性都添加为服务属性,因此您可以轻松地在创建数据源的配置上设置“db”服务属性(如果以这种方式实现)。

这是 DS 最不为人知的优势之一,我可以告诉你这是巨大的。要开始使用这个,只需在 bndtools 中创建一个 DS 项目,然后创建一个新的运行描述符并选择 Webconsole 模板。

DS 的另一个优点是它很小,并且不会试图隐藏动态,这在蓝图中可能会很痛苦。

于 2013-10-23T06:54:02.373 回答