多接口实现 - AEM / CQ - OSGi

时间:2016-03-22 06:13:37

标签: osgi cq5 aem sling

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

实现的

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;

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

1 个答案:

答案 0 :(得分:6)

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

  

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

     

如果有多个目标服务   相同的服务排名,然后绑定的服务必须是目标   具有最高服务等级和最低服务ID的服务   由service.id属性指定。

即,它取决于组件的“服务排名”。如果未指定此排名,则可以进行任何实现(通常获得最旧的服务)。如果要定位特定实现,可以使用过滤器。