我在OSGi中找到了@Component的一个属性,我不通过文档理解它并且没有获得任何详细信息,即启用。
我从Felix documentation about scr annotation得到的是:
启用
enabled
Default: true
SCR Descriptor: component.enabled
Metatype Descriptor: --
捆绑包启动时是否启用组件
即时
immediate
Default: --
SCR Descriptor: component.immediate
Metatype Descriptor: --
是否立即激活组件
虽然我知道“激活组件”,但我不明白“启用组件”这个术语是什么意思?
在用例或示例的帮助下,任何答案,何时使用什么,都会更受欢迎。
先谢谢你。
答案 0 :(得分:5)
默认情况下,组件为enabled=true
,这意味着只要它们的依赖关系,它们就可以激活 - 例如,必要的配置和/或强制性服务参考 - 已经满足。
即使满足所有依赖项,enabled=false
的组件也无法激活。它完全禁用,无法启动。
那么......有什么用?好吧,一个禁用的组件可以由同一个包中的另一个组件以编程方式启用。
主要用例是共享初始化。假设您有一个包含几个组件的包,这些组件都需要等待一些初始化步骤发生,比如设置一堆文件。您可以创建除 enabled=false
之外的所有组件。单个启用的组件在其激活方法中执行初始化,然后调用ComponentContext.enableComponent(null)
以启用包中的所有其他组件。
immediate
是一个完全独立且正交的生命周期概念。默认情况下,提供服务的组件是“延迟的”,这意味着只有在其他一些bundle实际使用该服务时才会加载和激活该组件。这是一个非常有用的延迟加载优化。但是,有时您希望组件尽快启动,即使没有人使用其服务。在这些情况下,您需要设置immediate=true
。
答案 1 :(得分:2)
已启用是组件生命周期中的状态之一。这是组件的初始和默认状态。其中immediate=true
是您在已启用的组件上执行的操作,可立即将其更改为活动状态,而不是延迟激活(immediate = false
)。
现在,在启用状态和活动状态之间,服务组件会经历几个满足所有依赖关系的状态,绑定所有引用(@References
),创建组件实例,组件上下文对象,等等 - 所有这些都需要时间和记忆。
关于使用enabled
和immediate
的用例,您可以使用这些描述符来优化组件的初始内存占用和加载时间。在某些情况下,您可能希望以编程方式启用或激活已禁用的组件。在这种情况下,组件最初被禁用,甚至不会尝试移动到下一个状态,从而优化了bundle的时间和内存占用(这个组件所属的bundle)。
阅读this博客的生命周期部分,让您清楚了解OSGi
DS。