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

Why do we need a interface to define every service in aem?

我已经使用了一段时间,但不知何故从未想过这个。我参与过的每个 aem 项目的代码结构都有一个相似之处。每个编写的服务都有一个接口。

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

可以@reference@inject不使用没有接口的服务吗?

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

另一方面,您不需要使用接口。尤其是当我在捆绑包中连接组件时,接口通常是一个不必要的层。在这种情况下,只需使用 class.

直接导出服务即可

参见here for an example

@Component(service = DistributionMetricsService.class)
public class DistributionMetricsService {
...
}

here for the client code

@Reference
private DistributionMetricsService distributionMetricsService;

因此,主要区别在于,如果要导出组件及其实现,则必须指定 service 属性 class。