【发布时间】:2019-05-13 17:18:36
【问题描述】:
在 OSGi 声明式服务中,我可以像这样创建声明 ComponentServiceObjects 的原型实例:
@Reference(unbind = "-",
scope=ReferenceScope.PROTOTYPE_REQUIRED)
private ComponentServiceObjects<MyService> serviceProvider;
然后实例化服务
service = serviceProvider.getService();
然后我可以通过使用 setter 设置一些其他属性(配置值或非 OSGi 协作者)来完成实例的配置。这有一个问题,即在初始化完成之前执行激活。
有没有办法在激活服务之前注入这个属性?
我在 Liferay Portal 7 的上下文中使用 DS
编辑
作为澄清,我有一个例子:假设我有一个组件 DirectoryListener。我想初始化这个组件的几个实例,每个实例都有一个不同的目录。我想在激活过程中根据这个目录做一些初始化。
【问题讨论】:
-
你能澄清一下吗?您想在组件初始化完成之前调用服务上的一些方法吗?那是不可能的...... DS 提供的保证是组件将在任何服务使用者调用任何方法之前完全初始化。
-
顺便说一句,
@Reference上的unbind="-"属性什么都不做,应该删除。 -
感谢您对取消绑定的评论!我在我的代码中使用它是因为我在很多其他地方都看到过它,但我觉得它没用。
-
作为澄清,我有一个例子:假设我有一个组件
DirectoryListener。我想初始化这个组件的几个实例,每个实例都有一个不同的目录。我想在激活过程中根据这个目录做一些初始化。如果不可能,我将不得不使用另一种在激活后运行的方法。还是有更好的方法? -
不,这是不可能的,组件的客户端无法决定该组件的配置。听起来你想注册一个
DirectoryListenerFactory。
标签: java osgi declarative-services