我注意到开发人员创建Apache Felix服务的多种方式 . 每个附加的片段似乎都有效 . 需要一些帮助才能理解,哪种语法最适合哪种情况
示例1:没有界面创建的服务
- 服务声明
d
@Component
@Service(ServiceViaClass.class)
public class ServiceViaClass{
}
- 通过@Reference批注使用服务
private ServiceViaClass serviceViaClass;
示例2:服务实现界面 . @Service注释没有值属性 - 服务声明
@Component
@Service
public class ServiceViaInterfaceImpl implements ServiceViaInterface{
}
- 通过@Reference批注使用服务
private ServiceViaInterface serviceViaInterface;
示例3:具有@Service注释的value属性的服务实现接口 - 服务声明
@Component
@Service(ServiceViaInterface.class)
public class ServiceViaInterfaceImpl implements ServiceViaInterface{
}
- 通过@Reference批注使用服务
private ServiceViaInterface serviceViaInterface;
1 回答
组件实现接口并将其自身发布为该接口下的服务,以便客户端可以仅使用接口查找组件 .
Sample 1 - 使用组件的具体类型发布服务 - 几乎总是无用的 . 该服务只能使用具体类型找到,如果客户端可以看到具体类型,那么为什么不直接实例化它而不是从服务注册表中获取实例?
Sample 2 - 通过实现接口发布服务,然后只需添加
@Service
注释 - 就是您通常应该做的事情 . 当您使用@Service
并且组件直接实现接口时,构建工具会推断您的组件希望在该接口下作为服务发布 .Sample 3 在运行时与样本2具有完全相同的效果,它显式,其他(包括我)不喜欢它,因为它是多余的 .