【发布时间】: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 中的另一个示例,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;
如果同时使用服务排名和过滤器,则过滤器优先。
【问题讨论】:
-
您可能有一个非常正当的理由这样做,但也要考虑为什么您想要连接到给定的服务实现。 (只是感觉它与声明式服务的想法背道而驰)
-
是的 anotherdave,这是出于好奇,看到 2 个
SlingRepository实现时我想到了一个问题,想看看它是如何工作的 :) -
酷,我只是说我会检查 :)
-
请问为什么它与声明式服务的理念背道而驰?从你的讨论中,我觉得我没有理解 DS 的意义。