在OSGi声明式服务中,我可以创建声明ComponentServiceObjects
的原型实例,如下所示:
@Reference(unbind = "-",
scope=ReferenceScope.PROTOTYPE_REQUIRED)
private ComponentServiceObjects<MyService> serviceProvider;
然后使用实例化服务
service = serviceProvider.getService();
然后,我可以通过使用设置器设置一些其他属性(配置值或非OSGi协作者)来完成实例的配置。这样的问题是,激活是在初始化完成之前执行的。
是否有一种在激活服务之前注入此属性的方法?
我正在Liferay Portal 7中使用DS
编辑
为澄清起见,我有一个示例:假设我有一个组件DirectoryListener。我想初始化该组件的多个实例,每个实例具有不同的目录。我想在此目录的激活过程中进行一些初始化。
答案 0 :(得分:1)
服务的使用者对实现的组件一无所知……或者实际上,该服务是否完全由组件来实现,而不是更底层的东西。因此,它不能决定组件的配置。
这听起来像您的用例要求将目录作为服务API的一部分,因此您的服务接口应为DirectoryListenerFactory
。该组件可以注册为简单的单例服务,并且目录可以通过例如createListener(File dir)
。
在这种情况下,您需要对生命周期有所注意。如果客户端调用createListener
,则在不再需要该监听器时应格外小心。例如,DirectoryListener
可以扩展java.lang.AutoCloseable
。
任何服务依赖项都可以通过@Reference
注入实现工厂的组件类中。我希望它们可以通过构造函数传递给DirectoryListener
实例。
答案 1 :(得分:0)
Neil Bartlett:
不可能,这不可能,一个组件的客户端不能决定该组件的配置。听起来您好像想注册
DirectoryListenerFactory
。