Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在运行时配置OSGi依赖项注入_Java_Dependency Injection_Osgi - Fatal编程技术网

Java 在运行时配置OSGi依赖项注入

Java 在运行时配置OSGi依赖项注入,java,dependency-injection,osgi,Java,Dependency Injection,Osgi,OSGi声明性服务似乎需要捆绑包的服务组件清单头中引用的XML描述符,该描述符必须在编译时添加到捆绑包中。SpringDM似乎也这样做 在编译模块后,如何进行依赖项注入,即使用文件系统中的某种配置文件(在捆绑包激活时解析)将类插入到一起?在OSGi中,您有µ服务,这些是组件向服务注册表注册的对象。声明性服务(DS)中的XML描述了组件类想要注册的服务,并声明了依赖项,即该组件类所需的服务 当保存组件类的bundle被激活时,DS会收到通知并读取XML描述符以了解依赖关系。当满足所有必需的依赖项时

OSGi声明性服务似乎需要捆绑包的服务组件清单头中引用的XML描述符,该描述符必须在编译时添加到捆绑包中。SpringDM似乎也这样做

在编译模块后,如何进行依赖项注入,即使用文件系统中的某种配置文件(在捆绑包激活时解析)将类插入到一起?

在OSGi中,您有µ服务,这些是组件向服务注册表注册的对象。声明性服务(DS)中的XML描述了组件类想要注册的服务,并声明了依赖项,即该组件类所需的服务

当保存组件类的bundle被激活时,DS会收到通知并读取XML描述符以了解依赖关系。当满足所有必需的依赖项时,它实例化组件类并使用Java反射注入所需的服务。这些服务是实现服务接口的普通java对象。一旦注入发生,它(可选)调用组件上的activate方法,然后将组件注册为服务

如果依赖项(服务)发生更改,则组件将被修改或关闭。可以重复此操作,直到捆绑停止

因此,对于一般的答案,注入器可以读取配置文件,实例化所提到的类,并根据此描述将它们连接在一起。OSGi非常独特,因为它不仅允许创建布线,而且还可以取消组件布线

现在是您的用例。只有在最极端的情况下,才应该选择JDBC实现。OSGi的整体思想是部署人员选择您应该使用的JDBC驱动程序。因此,正如您自己指出的,您应该使用注册表中的任何内容。此模型允许部署人员更灵活地选择JDBC驱动程序


然而,有时您确实需要供应商X的JDBC驱动程序的这一独特功能。在这种情况下,最好的解决方案是在代码中使用实现类,这将允许工具发现您具有这种实现依赖性

在Equinox中,您可以在运行时使用OSGi控制台上的“install”命令添加新插件。要从外部访问OSGi控制台,请将其配置为可通过telnet访问,如[此处][1]所示。您的确切用例是什么?[1] :例如,我的用例是选择要使用的JDBC驱动程序。但我认为答案是,您不能像在Spring中那样选择要使用的实现类,您所能做的只是选择一个接口,然后通过控制提供该接口的包的安装来控制使用哪个实现类。