【问题标题】:Why cant an osgi reference be declared as static datatype?为什么不能将 osgi 引用声明为静态数据类型?
【发布时间】:2021-11-06 05:57:39
【问题描述】:

我正在创建一个这样的 osgi 组件:

@Component (configurationPolicy = ConfigurationPolicy.OPTIONAL, immediate = true)
public class MyServiceAccessor
{
    @Reference (bind = "bindCluster", unbind = "unbindCluster", policy = ReferencePolicy.STATIC, cardinality = ReferenceCardinality.MANDATORY)
    private static Cluster cluster;

我在日志中收到以下消息:

 395 !ENTRY com.test.eventrecovery 4 0 2021-09-08 10:32:32.559
    396 !MESSAGE [com.test.eventrecovery.MyServiceAccessor(265)] Field cluster in component class com.test.eventrecovery.MyServiceAccessor must not be static

当我们为@Component 和@Reference 使用felix 注解时,我们没有遇到这个问题。 当我们转向 OSGI 注释时,我看到了这一点。 这种行为有什么具体原因吗?请指教。 此外,我无法访问 OSGI 官方文档,这让我更加烦恼。 :( http://docs.osgi.org/specification/osgi.cmpn/7.0.0/service.component.html - 此链接打不开。

【问题讨论】:

  • 我遵从@bjhargrave 的正确答案。只是想补充一点,这个问题表明了对 OSGi 组件的一个非常根本的误解,更普遍地说,是对 OSGi 的价值的误解。 OSGi 是基于 instance 的,永远不会是静态的。因此,您可以在令人作呕的 OSGi 框架中运行 OSGi 框架。允许静力学会扼杀这个非常基本的特性。删除所有非常量的静态数据往往会严重改进代码库。静态可能看起来很方便,但它们会腐蚀您的代码。

标签: java osgi apache-karaf


【解决方案1】:

组件实例是对象,因此所有引用都注入到实例字段中。不是静态字段。由于一个组件可以有多个实例,因此允许注入静态字段是有问题的。

试试https://docs.osgi.org/specification/osgi.cmpn/7.0.0/service.component.html

【讨论】:

  • 感谢您的链接。现在我明白了。我将重做代码以避免使用静态。
猜你喜欢
  • 2011-01-23
  • 2011-04-04
  • 2021-11-06
  • 2014-05-12
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多