Хотя неясно, как ваше приложение намеревается использовать эти различные реализации сервисов, один из способов сделать это - использовать свойства сервиса, а затем потребовать это свойство при фактической ссылке на эти сервисы у потребителя сервиса, например:
@Component (description = "Test1 service", ds = true, immediate = true)
@Service (value = {ServiceA.class})
@Property (name = "type", value = "test1")
class Test1 implements ServiceA{
// ...
}
@Component (description = "Test2 service", ds = true, immediate = true)
@Service (value = {ServiceA.class})
@Property (name = "type", value = "test2")
class Test2 implements ServiceA{
// ...
}
... и на стороне потребителя вы просто добавляете критерии выбора услуг для справки, например:
@Component (...)
class MyConsumer {
// ...
@Reference(target="(type=test2)")
ServiceA testService2;
// ...
}
Фабрики не нужны!:)
Для получения дополнительной информации посмотрите эту небольшую статью .
Если вам нужно динамически маршрутизировать к конкретной реализации службы на основе атрибутов запроса службы времени выполнения,Вы также можете хранить ссылку на все реализации сервиса и отображать их, используя желаемое свойство для быстрого выбора, например:
@Component (...)
class MyConsumer {
// ...
private final Map<String, ServiceA> services = // ...
@Reference(
cardinality = ReferenceCardinality.MULTIPLE,
policy = ReferencePolicy.DYNAMIC,
service = ServiceA.class,
target = "(type=*)"
)
public void addServiceA(ServiceA instance, Map properties) {
service.put(String.valueOf(properties.get("type")), instance);
}
public void removeServiceA(Map properties) {
service.remove(String.valueOf(properties.get("type")));
}
// ...
}