OSGi原型组件的初始化

时间:2018-12-12 15:00:02

标签: java osgi declarative-services

在OSGi声明式服务中,我可以创建声明ComponentServiceObjects的原型实例,如下所示:

@Reference(unbind = "-",
           scope=ReferenceScope.PROTOTYPE_REQUIRED)
private ComponentServiceObjects<MyService> serviceProvider;

然后使用实例化服务

service = serviceProvider.getService();

然后,我可以通过使用设置器设置一些其他属性(配置值或非OSGi协作者)来完成实例的配置。这样的问题是,激活是在初始化完成之前执行的。

是否有一种在激活服务之前注入此属性的方法?

我正在Liferay Portal 7中使用DS

编辑

为澄清起见,我有一个示例:假设我有一个组件DirectoryListener。我想初始化该组件的多个实例,每个实例具有不同的目录。我想在此目录的激活过程中进行一些初始化。

2 个答案:

答案 0 :(得分:1)

服务的使用者对实现的组件一无所知……或者实际上,该服务是否完全由组件来实现,而不是更底层的东西。因此,它不能决定组件的配置。

这听起来像您的用例要求将目录作为服务API的一部分,因此您的服务接口应为DirectoryListenerFactory。该组件可以注册为简单的单例服务,并且目录可以通过例如createListener(File dir)

在这种情况下,您需要对生命周期有所注意。如果客户端调用createListener,则在不再需要该监听器时应格外小心。例如,DirectoryListener可以扩展java.lang.AutoCloseable

任何服务依赖项都可以通过@Reference注入实现工厂的组件类中。我希望它们可以通过构造函数传递给DirectoryListener实例。

答案 1 :(得分:0)

Neil Bartlett:

  

不可能,这不可能,一个组件的客户端不能决定该组件的配置。听起来您好像想注册DirectoryListenerFactory