Java API';s newInstance和OSGi

Java API';s newInstance和OSGi,java,osgi,Java,Osgi,在任何情况下都可以直接在OSGi上下文中创建新的工厂实例吗?具体来说,Java API中的newInstance()如何 例如,调用TransformerFactory.newInstance()可以吗,还是应该避免?我认为这应该是可以的,因为它是JavaAPI的一部分,但是文档指定META-INF/services用于定位实现。这是否意味着它在与OSGi和第三方xml转换器(如Saxon)结合使用时无法按预期工作 在OSGi中使用XML相关工厂(如TransformerFactory)的正确方

在任何情况下都可以直接在OSGi上下文中创建新的工厂实例吗?具体来说,Java API中的newInstance()如何

例如,调用TransformerFactory.newInstance()可以吗,还是应该避免?我认为这应该是可以的,因为它是JavaAPI的一部分,但是文档指定META-INF/services用于定位实现。这是否意味着它在与OSGi和第三方xml转换器(如Saxon)结合使用时无法按预期工作


在OSGi中使用XML相关工厂(如TransformerFactory)的正确方法是什么?

您应该避免在OSGi中使用SPI。包含工厂类的包的类加载器通常看不到实现API的包的META-INF/服务

实现API的捆绑包应该注册一个或多个OSGi服务,而不是META-INF/services。只执行实例化和OSGi服务注册的适配器包可以很容易地编写

您可以在OSGi概要规范的“702XML解析器服务规范”中找到SAXParser和SAXParserFactory的示例。对于TransformerFactory,应使用类似的解决方案

更新

有些情况下,无法将这些工厂类用作OSGi服务。例如:如果您使用的技术使用TransformerFactory

对于与XML相关的API,我创建了

  • 包含xml API及其实现
  • 以在xmlcommons完整捆绑包中搜索实现的方式重写类加载机制
通过使用该捆绑包,使用XML相关工厂的旧技术将更有可能运行良好。为了确保与XML相关的API是从该捆绑包加载的,建议以排除上述包的方式重写org.osgi.framework.system.packages系统属性

该捆绑包也可在上获得