gpt4 book ai didi

java - OSGi原型(prototype)组件的初始化

转载 作者:行者123 更新时间:2023-11-30 05:52:02 26 4
gpt4 key购买 nike

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

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

然后实例化服务

service = serviceProvider.getService();

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

有没有办法在激活服务之前注入(inject)此属性?

我在 Liferay Portal 7 环境中使用 DS

编辑

作为澄清,我有一个例子:假设我有一个组件 DirectoryListener。我想初始化该组件的多个实例,每个实例都有不同的目录。我想在激活过程中根据这个目录做一些初始化。

最佳答案

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

听起来您的用例要求将目录作为服务 API 的一部分,因此您的服务接口(interface)应该是 DirectoryListenerFactory。该组件可以注册为简单的单例服务,并且目录将通过方法传递,例如createListener(文件目录).

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

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

关于java - OSGi原型(prototype)组件的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53745786/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com