有一个服务接口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中的另一个示例,SlingRepository
由AbstractSlingRepository
和AbstractSlingRepository2
进行了扩展,如何在内部选择实现,因为在使用时我们仅指定@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;
如果同时使用服务排名和过滤器,则过滤优先。
答案 0 :(得分:6)
这与Declaratives Services如何连接@Reference有关。从规范:
如果引用具有一元基数并且有多个基数 作为引用的目标服务,那么绑定的服务必须是 具有最高服务等级的目标服务 service.ranking属性。
如果有多个目标服务 相同的服务排名,然后绑定的服务必须是目标 具有最高服务等级和最低服务ID的服务 由service.id属性指定。
即,它取决于组件的“服务排名”。如果未指定此排名,则可以进行任何实现(通常获得最旧的服务)。如果要定位特定实现,可以使用过滤器。