OSGi 原型组件的初始化
Initialization of OSGi prototype components
在 OSGi 声明式服务中,我可以创建声明 ComponentServiceObjects
的原型实例,如下所示:
@Reference(unbind = "-",
scope=ReferenceScope.PROTOTYPE_REQUIRED)
private ComponentServiceObjects<MyService> serviceProvider;
然后用
实例化服务
service = serviceProvider.getService();
然后我可以通过设置器设置一些其他属性(配置值或非 OSGi 协作者)来完成实例的配置。这个有问题,初始化完成前就激活了
有没有办法在激活服务之前注入这个属性?
我在 Liferay Portal 7 的上下文中使用 DS
编辑
作为说明,我举了一个例子:假设我有一个组件 DirectoryListener。我想初始化这个组件的几个实例,每个实例都有不同的目录。我想在激活的时候根据这个目录做一些初始化。
尼尔·巴特利特:
No this isn't possible, the client of a component does not get to dictate the configuration of that component. It sounds like you want to register a DirectoryListenerFactory
instead.
服务的消费者对实现组件一无所知……或者实际上服务是否由组件实现,而不是更底层的组件。因此它不能指定组件的配置。
听起来您的用例要求将目录作为服务的一部分 API,因此您的服务接口应该是 DirectoryListenerFactory
。该组件可以注册为一个简单的单例服务,目录将通过方法传递,例如createListener(File dir)
.
在这种情况下,您需要注意生命周期。如果客户端调用 createListener
,则在不再需要时应小心释放该侦听器。例如 DirectoryListener
可以扩展 java.lang.AutoCloseable
.
任何服务依赖项都可以通过 @Reference
注入到实现工厂的组件 class 中。我希望它们通过构造函数传递给 DirectoryListener
个实例。
在 OSGi 声明式服务中,我可以创建声明 ComponentServiceObjects
的原型实例,如下所示:
@Reference(unbind = "-",
scope=ReferenceScope.PROTOTYPE_REQUIRED)
private ComponentServiceObjects<MyService> serviceProvider;
然后用
实例化服务service = serviceProvider.getService();
然后我可以通过设置器设置一些其他属性(配置值或非 OSGi 协作者)来完成实例的配置。这个有问题,初始化完成前就激活了
有没有办法在激活服务之前注入这个属性?
我在 Liferay Portal 7 的上下文中使用 DS
编辑
作为说明,我举了一个例子:假设我有一个组件 DirectoryListener。我想初始化这个组件的几个实例,每个实例都有不同的目录。我想在激活的时候根据这个目录做一些初始化。
尼尔·巴特利特:
No this isn't possible, the client of a component does not get to dictate the configuration of that component. It sounds like you want to register a
DirectoryListenerFactory
instead.
服务的消费者对实现组件一无所知……或者实际上服务是否由组件实现,而不是更底层的组件。因此它不能指定组件的配置。
听起来您的用例要求将目录作为服务的一部分 API,因此您的服务接口应该是 DirectoryListenerFactory
。该组件可以注册为一个简单的单例服务,目录将通过方法传递,例如createListener(File dir)
.
在这种情况下,您需要注意生命周期。如果客户端调用 createListener
,则在不再需要时应小心释放该侦听器。例如 DirectoryListener
可以扩展 java.lang.AutoCloseable
.
任何服务依赖项都可以通过 @Reference
注入到实现工厂的组件 class 中。我希望它们通过构造函数传递给 DirectoryListener
个实例。