Java 如何以良好的方式从SpringDI迁移到OSGiDI?

Java 如何以良好的方式从SpringDI迁移到OSGiDI?,java,eclipse,spring,eclipse-plugin,osgi,Java,Eclipse,Spring,Eclipse Plugin,Osgi,我有一个使用DI的Spring的Swing项目,现在我正在尝试迁移到Eclipse4和OSGi 使用Spring的配置文件,用户可以对bean进行注释/取消注释,以添加/删除功能(由这些后端bean提供)。 现在在Eclipse和OSGi中,我正在基于OSGi寻找实现这一点的最佳方法 我知道我可以将bean作为服务,并在OSGi中定义启动级别,但这并不能解决我的用例,即: 应用程序在没有运行这些bean/模块的情况下启动,如果用户从正在运行的UI更新配置,这些bean/模块将启动,并在应用程序的

我有一个使用DI的
Spring
Swing
项目,现在我正在尝试迁移到
Eclipse4
OSGi

使用
Spring
的配置文件,用户可以对bean进行注释/取消注释,以添加/删除功能(由这些后端bean提供)。
现在在
Eclipse
OSGi
中,我正在基于
OSGi
寻找实现这一点的最佳方法
我知道我可以将bean作为服务,并在
OSGi
中定义启动级别,但这并不能解决我的用例,即:
应用程序在没有运行这些bean/模块的情况下启动,如果用户从正在运行的UI更新配置,这些bean/模块将启动,并在应用程序的下一次启动时启动。

有没有一个好的/干净的方法来解决我的问题?

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

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

您可能希望使用它来管理Spring和OSGi之间的集成方式(Gemini Blueprint是Spring Dynamic模块的后续产品)。特别是,它可以为您处理几乎所有与动态服务注册相关的复杂性;您的bean可以保持几乎相同。

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

另一种方法是将声明性服务与配置管理一起使用,让配置数据确定要激活的服务

另一种方法是将声明性服务与配置管理一起使用,让配置数据确定要激活哪些服务

实现这一点的最佳方法是声明性服务(DS)。DS与OSGi的Configuration Admin集成,使得控制服务实例的数量及其配置和服务属性变得非常简单。例如,以下组件(带有bnd注释[很快将类似于OSGi规范中的类似功能]:

@Component(designateFactory=Config.class)
公共mycop实现MyService{
接口配置{
int端口();
字符串host();
}
配置配置;
@激活
无效激活(地图){
config=Configurable.createConfigurable(config.class,map);
start();
}
void foo(){…执行MyService操作…}
@参考文献
void setDataSource(数据源ds){…}
}
此组件需要配置管理员工厂配置。最好的方法是使用ApacheFelixWebconsole设置一个框架,看看它有多强大。
designateFactory=Config.class
告诉bnd在捆绑包中创建一个元类型XML文件。Webconsole使用它为从接口及其方法派生的配置数据创建一个非常漂亮的表单。此表单可识别类型,即不能为端口号输入非数字值。通过webconsole,您现在可以通过创建多个工厂配置来实例化多个组件。删除这些出厂配置将删除服务。在应用程序中,您可以在用户的控制下自己操作配置管理

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

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


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

实现这一点的最佳方法是声明性服务(Declarative Services,DS)。DS与OSGi的Configuration Admin集成,使得控制服务实例的数量及其配置和服务属性变得非常简单。例如,以下组件(带有bnd注释[很快将类似于OSGi规范中的类似功能]:

@Component(designateFactory=Config.class)
公共mycop实现MyService{
接口配置{
int端口();
字符串host();
}
配置配置;
@激活
无效激活(地图){
config=Configurable.createConfigurable(config.class,map);
start();
}
void foo(){…执行MyService操作…}
@参考文献
void setDataSource(数据源ds){…}
}
此组件需要配置管理员工厂配置。最好的方法是使用ApacheFelixWebconsole设置一个框架,看看它有多强大。
designateFactory=Config.class
告诉bnd创建一个元类型
    @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 ) { ... }
   }