我正在使用Osgi DS(在AEM环境中)。
我有一个由组件AImpl提供的服务A,该服务可以但不必处于活动状态(这取决于其配置的存在)。
有些系统具有其他功能,但是它是预先确定的,并且在启动时就知道。
现在,我还有其他组件(例如BImpl)可以选择将其与STATIC,OPTIONAL,GREEDY引用类型一起使用。
现在,如何确保Bimpl在引导过程中首次初始化时将其在活动的系统上获取。
换句话说,如何确保在AImpl应该处于活动状态的系统上,BImpl将始终在AImpl之后被初始化?
我不会避免这样的情况,BImpl和AImpl之间没有硬初始化依赖关系,并且BImpl首先被初始化,然后在启动期间最终激活AImpl时重新启动。
如果可能的话,我想避免使用启动级别(通常不建议在AEM中使用非默认启动级别的用户级别组件)。
最佳答案
这里有三个主要选项:
不用担心BImpl具有静态贪婪引用的事实意味着,在注册AImpl时,BImpl将被注入,即使这意味着销毁并重新初始化BImpl组件。这就是应该使用静态引用进行工作的方式,并且如果AImpl未注册/更新,也会发生这种情况。
是否可以使BImpl组件具有所需的配置?如果可以,则可以使用该配置将AImpl引用的最小基数从零更改为一。这将成为强制性参考,并确保您的BImpl在AImpl可用之前不会启动。引用的最小基数的配置为defined in the specification,可以使用Configuration Admin动态设置。
与2类似,但是创建一个APrimeImpl,该APrimeImpl通过存根实现来实现A,并具有所需的配置。使用此配置来激活存根A(或不激活),然后使BImpl(和所有实现)对A使用强制性引用。通过这种方式,您只需更改一种配置即可强制所有人使用真实的AImpl。另一方面,您失去了使某些引用成为必需而其他引用成为可选的能力。
选项1绝对是最简单的,这是我通常向人们推荐的选项。