OSGi中仅运行时依赖项的最佳实践

跑者:

在与线开闭原则,我通常设计我的Java包和库以这样的方式,有一个通用的“界面”或“API”包/库和一个或多个实现(非常相似,如JDBC许多共同的API或JAXP / SAX)。为了在不违反OCP的情况下在基本API库中定位一个实现(有时是多个实现),我通常使用Java的ServiceLoader机制,或者偶尔通过第三方库(如ClassGraphReflections)进行类路径扫描从Maven的角度来看,实现是作为runtime依赖项引入的(因为它们仅在执行时需要,而在编译时则不需要)。很标准的东西。

因此,现在,我想将其中一些软件包作为OSGi捆绑包提供(带有API和在单独的捆绑包中的实现),但是由于在OSGi中每个捆绑包都有自己的类加载器,因此类路径扫描和ServiceLoaderAPI都不能用于此目的。乍一看,OSGi的“碎片”机制似乎与上述纯Java设置最接近。在那种情况下,API束将是“片段主机”,而具体的实现将作为片段附加到该主机束。由于片段主机及其所有附加片段都使用相同的类加载器,因此标准的纯Java机制如ServiceLoader或者ClassGraph仍然可以正常工作。这还将具有以下优点:不需要检测库/捆绑包是否在OSGi上下文中运行,并且不需要OSGi框架依赖项。

因此,简而言之,我的问题是:片段是在OSGi中实现仅运行时依赖项的正确方法,还是有更好(或更标准)的方法?最好是,我正在寻找一种可以在OSGi容器中运行但不需要依赖于OSGi本身的解决方案。

彼得·克里恩斯:

在翻译之外,没有片段几乎总是错误的。OSGi模型是使用服务

接下来的方法是使用DS。使用bnd(在maven,gradle,ant,sbt或Bndtools中)可以创建components组件是一个普通的老式Java对象(PO​​JO),该对象带有注入和激活指令。您可以使这些组件在构造函数中采用其所有依赖性。

bnd代码使用注释生成XML文件,该XML文件在运行时用于创建,激活,注入和注册这些组件。这将在OSGi框架中立即可用。注释是构建时间,因此它们不会在运行时中创建依赖项。

在非OSGi环境中,您有责任自己调用该构造函数。因此,您可以使用Service Loader收集依赖关系,然后以正确的顺序构造它们。

@Component
public class MyComponent implements Foo {

      final Bar bar;

      @Activate
      public MyComponent( @Reference Bar bar ) {
        this.bar = bar;
      }
      ...
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在运行时控制OSGi中的依赖项注入

衡量运行时最佳实践(Python)

在Python轮子中包括运行时依赖项

OSGI运行时无法从本地存储库中提取依赖项

向Nix中的现有软件包添加和安装运行时依赖项的最佳方法?

如何在Inno Setup安装程序中捆绑来自NuGet软件包的仅运行时依赖项?

在运行时OSGi依赖关系中忽略的POJO的导入的Jackson注释

如何在SBT中将依赖项设置为运行时(以模仿Maven中的运行时作用域)?

如何在gradle jar任务生成的jar中包括运行时依赖项

在docker容器中运行时,golang项目找不到依赖项

如何根据Spring Boot运行时环境在Gradle中删除依赖项?

将运行时依赖项注入到nix包中

如何在Castle Windsor for C#中解决运行时依赖项

在运行时初始化依赖项

安全删除“未使用的”运行时依赖项

gradle 从运行时依赖项中排除特定的 jars

Spring从依赖项中选择运行时实现

Guice运行时依赖项参数重新注入

如何在运行时动态更改依赖项

指定Nix包运行时依赖项

Jar依赖项编译时间和运行时

Firebase依赖项在运行时导致错误

Google Guice运行时依赖项注入

使用依赖项注入在运行时确定实现

在Apache Spark中指定运行时依赖项

使用Google Guice在运行时注入依赖项

传递性运行时依赖项将被丢弃,从而导致运行时失败

更改Nexus中依赖项版本的最佳实践

使用代码在OSGi环境中增强运行时