【问题标题】:Multiple Interface Implementations - AEM/CQ - OSGi多接口实现 - AEM/CQ - OSGi
【发布时间】:2016-03-22 06:13:36
【问题描述】:

有一个服务接口HelloService,这是由2个Service implementations实现的

HelloService 接口

public interface HelloService {
    public String getRepositoryName();
}

HelloServiceImpl1 实现

@Service
@Component(metatype = false)
public class HelloServiceImpl1 implements HelloService {

    @Reference
    private SlingRepository repository;

    public String getRepositoryName() {
        return repository.getDescriptor(Repository.REP_NAME_DESC);
    }
}

HelloServiceimpl2 实现

@Service
@Component(metatype = false)
public class HelloServiceImpl2 implements HelloService {

    public String getRepositoryName() {
        return "Response from HelloServiceImpl2";
    }
}

现在使用我们使用的服务

@Reference
HelloService helloService;

在所需的方法中,调用为

helloService.getRepositoryName();

我总是收到来自HelloServiceImpl1 的回复。检查 AEM API 中的另一个示例,SlingRepositoryAbstractSlingRepositoryAbstractSlingRepository2 扩展,内部如何选择实现,因为在使用时我们只指定@Reference SlingRepository repository;

这在 AEM OSGi 中是如何处理的?


根据回复更新

检查了语法,以下是观察结果

若要使用服务排名,请在服务实现中使用以下功能

@Properties({
    @Property(name = Constants.SERVICE_RANKING, intValue = 100)
})

为此,消费没有变化,选择更高的服务排名实现,控制权在提供者手中

@Reference
HelloService helloService;

要使用目标过滤器,请使用以下注解来指定属性

@Properties({
   @Property(name="type", value="Custom")
})

在基于过滤器消费时,指定目标,控制在消费者手中

 @Reference (target="(type=Custom)")
 HelloService helloService;

如果同时使用服务排名和过滤器,则过滤器优先。

【问题讨论】:

  • 您可能有一个非常正当的理由这样做,但也要考虑为什么您想要连接到给定的服务实现。 (只是感觉它与声明式服务的想法背道而驰)
  • 是的 anotherdave,这是出于好奇,看到 2 个 SlingRepository 实现时我想到了一个问题,想看看它是如何工作的 :)
  • 酷,我只是说我会检查 :)
  • 请问为什么它与声明式服务的理念背道而驰?从你的讨论中,我觉得我没有理解 DS 的意义。

标签: osgi aem sling


【解决方案1】:

这与Declaratives Services 如何连接@Reference 有关。来自规范:

如果引用具有一元基数并且有多个 引用的目标服务,那么绑定的服务必须是 具有最高服务等级的目标服务 service.ranking 属性。

如果有多个目标服务 相同的服务排名,那么绑定的服务一定是目标 服务排名最高、服务 ID 最低的服务为 由 service.id 属性指定。

即,它取决于组件的“服务排名”。如果未指定此排名,那么您可以有任何实现(您通常会获得最旧的服务)。如果要针对特定​​实现,可以使用过滤器。

【讨论】:

    猜你喜欢
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 2014-10-22
    • 2019-02-23
    • 1970-01-01
    相关资源
    最近更新 更多