Osgi 为什么要实现创建ApacheFelix服务的接口?

Osgi 为什么要实现创建ApacheFelix服务的接口?,osgi,apache-felix,declarative-services,Osgi,Apache Felix,Declarative Services,我注意到开发人员创建ApacheFelix服务的多种方式。所附的每个代码片段似乎都有效。需要一些帮助才能理解,哪种语法最适合哪种场景 示例1:创建的服务没有接口 服务声明 D 通过@Reference注释使用服务 私人服务类服务类 示例2:服务实现接口。@Service注释没有值属性 -服务声明 @Component @Service public class ServiceViaInterfaceImpl implements ServiceViaInterface{ } @Comp

我注意到开发人员创建ApacheFelix服务的多种方式。所附的每个代码片段似乎都有效。需要一些帮助才能理解,哪种语法最适合哪种场景

示例1:创建的服务没有接口

  • 服务声明
D

  • 通过@Reference注释使用服务

    私人服务类服务类

示例2:服务实现接口。@Service注释没有值属性 -服务声明

@Component
@Service
public class ServiceViaInterfaceImpl implements ServiceViaInterface{
}
@Component
@Service(ServiceViaInterface.class)
public class ServiceViaInterfaceImpl implements ServiceViaInterface{
}
  • 通过@Reference注释使用服务

    专用ServiceViaInterface ServiceViaInterface

示例3:@Service注释的带有value属性的服务实现接口 -服务声明

@Component
@Service
public class ServiceViaInterfaceImpl implements ServiceViaInterface{
}
@Component
@Service(ServiceViaInterface.class)
public class ServiceViaInterfaceImpl implements ServiceViaInterface{
}
  • 通过@Reference注释使用服务

    专用ServiceViaInterface ServiceViaInterface


组件实现一个接口,并将自身作为该接口下的服务发布,以便客户端可以仅使用该接口查找组件

示例1使用组件的具体类型发布服务几乎总是无用的。只有使用具体类型才能找到服务,如果客户端可以看到具体类型,那么为什么不直接实例化它,而不是从服务注册表获取实例呢

示例2-通过实现接口发布服务,然后只添加
@service
注释,这是您通常应该做的事情。当您使用
@Service
并且组件直接实现一个接口时,构建工具推断您的组件希望作为该接口下的服务发布

示例3在运行时与示例2具有完全相同的效果,只是在代码中更加明确了一点。有些人喜欢它,因为它是明确的,其他人(包括我)不喜欢它,因为它是多余的