【问题标题】:what is 'enable=true' attribute of @Component in OSGi Component?OSGi 组件中@Component 的“enable=true”属性是什么?
【发布时间】:2018-04-19 06:54:03
【问题描述】:

我通过 OSGi 中的 @Component 属性获得了我通过文档无法理解的属性,并且没有获得任何详细信息,即启用。

我从Felix documentation about scr annotation 得到的是:

启用

enabled 
Default: true 
SCR Descriptor: component.enabled 
Metatype Descriptor: -- 

bundle 启动时是否启用组件

立即

immediate 
Default: -- 
SCR Descriptor: component.immediate 
Metatype Descriptor: -- 

组件是否立即激活

虽然我知道“激活组件”,但我不明白“启用组件”一词是什么意思?

任何在用例或示例的帮助下的答案,何时使用什么,都将受到赞赏。

在此先感谢您。

【问题讨论】:

    标签: components osgi aem


    【解决方案1】:

    组件默认为enabled=true,这意味着只要它们的依赖项就可以激活它们——例如所需的配置和/或强制服务参考——已满足。

    即使满足所有依赖项,enabled=false 的组件也将无法激活。它已完全禁用,不会启动。

    那么……这有什么用??好吧,一个禁用的组件可以由同一个包中的另一个组件以编程方式启用。

    主要用例是共享初始化。假设您有一个包含多个组件的包,这些组件都需要等待一些初始化步骤发生,例如设置一堆文件。您可以制作所有组件除了一个enabled=false。单个启用的组件在其激活方法中进行初始化,然后调用ComponentContext.enableComponent(null) 以启用捆绑包中的所有其他组件。

    immediate 是一个完全独立且正交的生命周期概念。默认情况下,提供服务的组件是“延迟的”,这意味着该组件仅在其他捆绑包实际使用该服务时才加载和激活。这是一个非常有用的延迟加载优化。然而,有时您希望您的组件尽快启动,即使没有人使用它的服务。在这些情况下,您设置immediate=true

    【讨论】:

      【解决方案2】:

      启用是组件生命周期中的状态之一。这是组件的初始和默认状态。 immediate=true 是您在启用的组件上执行的操作,以立即将其更改为 Active 状态,而不是延迟激活 (immediate = false)。

      现在在启用状态和活动状态之间,服务组件经历了几个状态,它满足所有依赖关系,绑定所有引用(@References),创建组件实例,组件上下文对象等 -所有这些都需要时间和记忆。

      关于使用enabledimmediate 的用例,您可以使用这些描述符来优化组件的初始内存占用和加载时间。在某些情况下,您可能希望仅在特定条件下以编程方式启用或激活禁用的组件。在这种情况下,组件最初被禁用,甚至不会尝试移动到下一个状态,从而优化了捆绑包(该组件所属的捆绑包)的时间和内存占用。

      阅读 this 博客的生命周期部分 - 让您清楚地了解 OSGi DS。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-17
        • 1970-01-01
        • 2014-01-29
        • 2014-02-16
        • 2021-04-07
        • 2017-09-29
        • 1970-01-01
        相关资源
        最近更新 更多