Java 最好使用类型或属性在OSGi声明性服务之间进行选择吗?

Java 最好使用类型或属性在OSGi声明性服务之间进行选择吗?,java,osgi,declarative-services,Java,Osgi,Declarative Services,我目前正在将一段代码从普通Java代码转换为OSGi声明性服务 原始纯Java代码 这些类的声明如下: class AggregateServiceImpl implements Service class ChildServiceImpl1 implements Service class ChildServiceImpl2 implements Service class ChildServiceImpl3 implements Service 所以所有类都实现服务,但聚合实现能够在调用时

我目前正在将一段代码从普通Java代码转换为OSGi声明性服务

原始纯Java代码 这些类的声明如下:

class AggregateServiceImpl implements Service
class ChildServiceImpl1 implements Service
class ChildServiceImpl2 implements Service
class ChildServiceImpl3 implements Service
所以所有类都实现服务,但聚合实现能够在调用时推迟到子服务

AggregateServiceImpl本身并不知道其他实现的存在。其构造函数最初声明为:

public class AggregateServiceImpl(Service... children)
澄清:接口名称“服务”是通用的,并不表示OSGi DS或服务概念

转换为OSGi 首先,我将每个实现移动到它自己的包中。然后我声明我的组件(服务实现)。我碰巧使用了bnd,所以我使用了服务注释。例如:

@Component
class ChildServiceImpl1 implements Service
在客户机类中,我们可以使用低级OSGiAPI查找服务,或者使用该捆绑包中的DS为我们创建对象

问题 查找“服务”的最佳方式是什么?我想要AggregateServiceImpl,但可能会收到一个ChildServiceImpl


在查找ServiceReferences时,最好使用单独的服务类型或将属性添加到其中一个组件(例如“isRootService”)以用作筛选器?

最好的方法是使用服务注册属性

 @Component
 @Service
 @Property(name = "service.id", value = "<some service unique ID")
 class ChildServiceImpl1 implements Service{...}
@组件
@服务

@属性(name=“service.id”,value=“最好的方法是使用服务注册属性

 @Component
 @Service
 @Property(name = "service.id", value = "<some service unique ID")
 class ChildServiceImpl1 implements Service{...}
@组件
@服务
@属性(name=“service.id”,value=“如果AggregateServiceImpl是其他bundle使用的唯一服务,那么它应该是您注册的唯一服务

从您当前显示的代码中,我们无法判断AggregateServiceImpl类是否依赖于服务或实际实现

如果它直接依赖于其他实现,而不是服务接口(如您当前所述),则聚合捆绑包应直接创建它所需的其他实现类,然后将AggregateServiceImpl注册为服务

如果其他实现也需要在其他地方使用,那么您应该使用属性(如您所建议的)因此消费者可以区分它们。在这种情况下,您仍然不能使用DS构建聚合,因为它对服务没有依赖关系。如果AggregateServiceImpl是其他捆绑包使用的唯一服务,那么它应该是您注册的唯一服务

从您当前显示的代码中,我们无法判断AggregateServiceImpl类是否依赖于服务或实际实现

如果它直接依赖于其他实现,而不是服务接口(如您当前所述),则聚合捆绑包应直接创建它所需的其他实现类,然后将AggregateServiceImpl注册为服务


如果其他实现也需要在其他地方使用,那么您应该使用属性(如您所建议的)因此消费者可以区分它们。在这种情况下,您仍然不能使用DS构建聚合,因为它对服务没有依赖性

谢谢,这就是我目前正在做的。谢谢,这就是我目前正在做的。不,它对服务有依赖性。它不关心其chil的实现细节它不知道这些类的存在(尽管客户机代码在原始Java代码中确实存在)。感谢您指出。其他实现作为服务来来去去。服务关系的基数为0…n.不,它依赖于服务。它不关心其子级的实现细节,也不知道这些类的存在(虽然客户机代码当然是在原始Java代码中)。感谢您指出这一点。其他实现作为服务来来去去去。服务关系的基数是0…n。
bc.getServiceReferences(Service.class.getName(), "(service.id=<some value>)");
@Reference(target = "(service.id=<some value>)", cardinality = ...)
private Service service;