Java 最好使用类型或属性在OSGi声明性服务之间进行选择吗?
我目前正在将一段代码从普通Java代码转换为OSGi声明性服务 原始纯Java代码 这些类的声明如下: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 所以所有类都实现服务,但聚合实现能够在调用时
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;