Java 如何以良好的方式从SpringDI迁移到OSGiDI?
我有一个使用DI的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/模块将启动,并在应用程序的
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 ) { ... }
}