【问题标题】:Why implement interface for creating Apache Felix services?为什么要实现创建 Apache Felix 服务的接口?
【发布时间】:2017-04-24 04:47:14
【问题描述】:

我注意到开发人员创建 Apache Felix 服务的多种方式。每个附加的 sn-ps 似乎都有效。需要一些帮助才能理解,哪种语法最适合哪种场景

示例 1:无接口创建的服务

  • 服务声明

D

@Component
@Service(ServiceViaClass.class)
public class ServiceViaClass{
}
  • 通过@Reference注解使用服务

    私有ServiceViaClass serviceViaClass;

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

@Component
@Service
public class ServiceViaInterfaceImpl implements ServiceViaInterface{
}
  • 通过@Reference注解使用服务

    私有ServiceViaInterface serviceViaInterface;

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

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

    私有ServiceViaInterface serviceViaInterface;

【问题讨论】:

    标签: osgi apache-felix declarative-services


    【解决方案1】:

    组件实现了一个接口,并在该接口下将自己发布为服务,以便客户端可以仅使用该接口找到该组件。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 2020-05-14
      • 2014-04-08
      • 1970-01-01
      • 2011-02-12
      • 2011-05-05
      相关资源
      最近更新 更多