【问题标题】:Programmatically using components in OSGi以编程方式使用 OSGi 中的组件
【发布时间】:2012-03-22 21:49:36
【问题描述】:

在我的应用程序中,单独使用服务是毫无用处的。您总是需要一些外部配置信息才能使服务可用。

组件与 ConfigurationAdmin 相结合是有意义的,因为从那时起,对于我创建的每个配置,都会创建一个组件实例。这非常适合我的用例。

现在,问题出现了,如果我想以编程方式使用来自其他包的组件怎么办?这有意义吗?

我知道我可以再次将组件导出为服务,并从其他 bean 中使用它,但是假设我有一个 servlet,用户可以在其中创建配置,并且对于每个配置的实例都有一个操作列表;当他点击动作时,我需要找到合适的组件,并对其执行动作。

在 OSGi 之上实现此功能的最佳方式是什么?

【问题讨论】:

    标签: java components osgi declarative-services


    【解决方案1】:

    “以编程方式使用来自另一个包的组件”听起来完全对我来说就像 OSGi 服务。

    【讨论】:

    • 从配置数据中重新导出自动构建的组件很常见吗?
    • 我不明白你在问什么,你能澄清一下吗?
    • 如果我理解正确,我可以使用 DS 来指定对于每个可用的配置,它应该创建一个组件;就像如果我有一个连接服务,我想为它创建不同的配置(假设我想要一个串行连接和一个可用的 telnet 连接),那么我可以让 DS 构建两个组件吗?如果是这样,我还可以在不同的接口下注册服务(比如说 Connected),现在该服务也注入了配置数据。对不起这个愚蠢的例子:)
    • 现在我回想起来,ManagedServiceFactory 似乎是一个理想的选择 - 还有什么更好的吗?
    • 对,DS 允许您通过提供多个配置记录来创建组件的多个实例。然而,每个实例都是相同类型的组件:即相同的实现类、相同的已发布服务类型、相同的服务引用等。
    【解决方案2】:

    此方法检索 osgi 服务(iso 让 osgi 容器连接依赖项):

    public class ServiceLocator {
    
      public static <T extends Object> T getService(final Class<T> clazz) {
        final BundleContext bundleContext = FrameworkUtil.getBundle(clazz).getBundleContext();
        // OSGI uses the order of registration if multiple services are found
        final ServiceReference<T> ref =     bundleContext.getServiceReference(clazz);
        return bundleContext.getService(ref);
      }
    

    }

    我在现有项目中引入 DS 时使用了此功能,而该项目并未在任何地方使用 DS。并非项目中的所有组件都被实例化为 osgi DS 组件。任何我需要访问通过任何其他方式实例化的类中的 DS 组件的地方,我都使用了这个方法......

    【讨论】:

      猜你喜欢
      • 2014-06-01
      • 2011-06-08
      • 1970-01-01
      • 2013-11-17
      • 2017-06-02
      • 2013-07-03
      • 2018-07-26
      • 2014-01-12
      相关资源
      最近更新 更多