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

时间:2018-04-19 06:54:03

标签: components osgi aem

我在OSGi中找到了@Component的一个属性,我不通过文档理解它并且没有获得任何详细信息,即启用。

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

启用

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

捆绑包启动时是否启用组件

即时

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

是否立即激活组件

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

在用例或示例的帮助下,任何答案,何时使用什么,都会更受欢迎。

先谢谢你。

2 个答案:

答案 0 :(得分:5)

默认情况下,组件为enabled=true,这意味着只要它们的依赖关系,它们就可以激活 - 例如,必要的配置和/或强制性服务参考 - 已经满足。

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

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

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

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

答案 1 :(得分:2)

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

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

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

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