在运行时配置OSGi依赖注入

时间:2013-06-07 10:32:04

标签: java dependency-injection osgi

OSGi声明性服务似乎需要在bundle的Service-Component清单头中引用XML描述符,必须在编译时将其添加到bundle中。 Spring DM似乎也是如此。

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

1 个答案:

答案 0 :(得分:2)

在OSGi中,您有μservices,这些是组件服务注册表注册的对象。声明性服务(DS)中的XML描述了组件类要注册的服务,它声明了依赖关系,即此组件类所需的服务。

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

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

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

现在你的用例。只有在最极端的情况下才应该选择JDBC实现。 OSGi的整个想法是部署者选择你应该使用的JDBC驱动程序。因此,当您表明自己时,您应该使用注册表中的任何内容。该模型允许部署者更灵活地选择JDBC驱动程序。

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