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

时间:2019-04-23 04:11:51

标签: service interface osgi aem

我已经合作了一段时间,但是以某种方式从未考虑过。我从事的每个aem项目在代码结构上都有一个相似之处。每个编写的服务都有一个接口。

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

@reference@inject在没有界面的情况下不能使用服务吗?

1 个答案:

答案 0 :(得分:6)

使用接口是一种将服务用户与实现脱钩的好习惯。在很多情况下,您甚至希望拥有一个API捆绑包,因此该服务的用户不需要对实现捆绑包有maven依赖。

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

请参见here for an example

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

here for the client code

@Reference
private DistributionMetricsService distributionMetricsService;

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