OSGi组件中@Component的'enable=true'属性是什么?

what is 'enable=true' attribute of @Component in OSGi Component?

我在 OSGi 中遇到了 @Component 的一个属性,我无法通过文档理解它,也没有获得任何详细信息,即已启用。

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

启用

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

Whether the component is enabled when the bundle starts

立即

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

Whether the component is immediately activated

虽然我知道"Activating a component",但是我不明白"Enabling a component"这个词是什么意思?

任何在用例或示例的帮助下回答,什么时候使用什么,我们都非常感激。

提前致谢。

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

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

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

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

默认情况下,组件是 enabled=true,这意味着一旦它们的依赖关系可用,它们就可以激活——例如所需配置 and/or 强制服务引用 -- 已满足。

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

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

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

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