Service 为什么我们需要一个接口来定义aem中的每个服务?

Service 为什么我们需要一个接口来定义aem中的每个服务?,service,interface,osgi,aem,Service,Interface,Osgi,Aem,我已经和他一起工作了一段时间,但不知怎么的,我从来没有想过这一点。我参与的每个aem项目在代码结构上都有一个相似之处。编写的每个服务都有一个接口 我的问题是为什么每个服务都需要一个接口 @reference或@inject是否可以在没有接口的情况下不使用服务?使用接口是将服务用户与实现分离的良好实践。在许多情况下,您甚至希望有一个API捆绑包,以便服务的用户不需要对实现捆绑包的maven依赖关系 另一方面,您不需要使用接口。特别是当我在捆绑包中连接组件时,接口通常是不必要的层。在这种情况下,只需

我已经和他一起工作了一段时间,但不知怎么的,我从来没有想过这一点。我参与的每个aem项目在代码结构上都有一个相似之处。编写的每个服务都有一个接口

我的问题是为什么每个服务都需要一个接口


@reference
@inject
是否可以在没有接口的情况下不使用服务?

使用接口是将服务用户与实现分离的良好实践。在许多情况下,您甚至希望有一个API捆绑包,以便服务的用户不需要对实现捆绑包的maven依赖关系

另一方面,您不需要使用接口。特别是当我在捆绑包中连接组件时,接口通常是不必要的层。在这种情况下,只需直接使用类导出服务

见:

以及:


因此,主要的区别在于,如果要导出带有实现类的组件,则必须指定
服务
属性。

1。您所说的“API捆绑包让用户不需要maven依赖”是什么意思?API包如何封装实现和原始服务?2.在我的理解中,服务属性将始终保持组件类的值。那么,指定它不是多余的吗?感谢您的帮助。如果您使用界面发布服务,那么服务的用户只会引用该界面。如果随后将接口放入API包中以将其与实现分离,那么服务的用户只需要依赖maven中的API包。这是一个将服务的用户和提供者解耦的好实践。
@Component(service = DistributionMetricsService.class)
public class DistributionMetricsService {
...
}
@Reference
private DistributionMetricsService distributionMetricsService;