OSGi 声明式服务似乎需要在包的 Service-Component 清单头中引用的 XML 描述符,必须在编译时将其添加到包中。Spring DM 似乎也是如此。
编译模块后如何进行依赖注入,即。使用在捆绑激活时解析的文件系统中的某种配置文件将类插入在一起?
OSGi 声明式服务似乎需要在包的 Service-Component 清单头中引用的 XML 描述符,必须在编译时将其添加到包中。Spring DM 似乎也是如此。
编译模块后如何进行依赖注入,即。使用在捆绑激活时解析的文件系统中的某种配置文件将类插入在一起?
在 OSGi 中,您有µservices,这些是组件向服务注册表注册的对象。声明式服务 (DS) 中的 XML 描述了组件类想要注册的服务,并声明了依赖关系,即该组件类所需的服务。
当包含组件类的包被激活时,DS 会收到通知并读取 XML 描述符以了解依赖关系。当满足所有强制依赖项时,它会实例化组件类并使用 Java 反射注入所需的服务。服务是实现服务接口的普通 java 对象。一旦注入发生,它(可选)调用组件上的激活方法,然后将组件注册为服务。
如果依赖项(服务)发生更改,则组件被修改或关闭。这可以重复,直到捆绑停止。
因此,对于一般性的答案,注入器可以读取配置文件,实例化提到的类,然后根据该描述将它们连接在一起。OSGi 非常独特,因为它不仅允许创建连线,而且还可以取消连线组件。
现在你的用例。只有在最极端的情况下,您才应该选择 JDBC 实现。OSGi 的整个想法是部署者选择一个您应该使用的 JDBC 驱动程序。因此,正如您自己指出的那样,您应该使用注册表中的任何内容。此模型允许部署者在选择 JDBC 驱动程序时更加灵活。
但是,有时您确实需要供应商 X 的 JDBC 驱动程序的这一独特功能。在这种情况下,最好的解决方案是在你的代码中使用实现类,这将允许工具找出你有这个实现依赖。