我目前正在将一段代码从纯 Java 代码转换为 OSGi 声明式服务。
原始纯 Java 代码
new AggregateServiceImpl(
new ChildServiceImpl1(),
new ChildServiceImpl2(),
new ChildServiceImpl3()
);
这些类是这样声明的:
class AggregateServiceImpl implements Service
class ChildServiceImpl1 implements Service
class ChildServiceImpl2 implements Service
class ChildServiceImpl3 implements Service
所以所有的类都实现了 Service,但是 Aggregate 实现能够在调用时推迟到子 Service。
AggregateServiceImpl 本身不知道其他实现的存在。它的构造函数最初声明为:
public class AggregateServiceImpl(Service... children)
澄清:接口名称“服务”是通用的,并不意味着代表 OSGi DS 或服务概念。
转换为 OSGi
首先,我将每个实现移动到它自己的包中。然后我声明我的组件(服务实现)。我碰巧在使用bnd,所以我使用服务注释。例如:
@Component
class ChildServiceImpl1 implements Service
在客户端类中,我们可以使用低级 OSGi API 查找服务或使用该捆绑包中的 DS 为我们创建对象。
问题
查找“服务”的最佳方式是什么?我想要AggregateServiceImpl 但我可能会收到 ChildServiceImpl 之一。
在查找 ServiceReferences 时,最好使用单独的服务类型或将属性添加到其中一个组件(例如“isRootService”)以用作过滤器?