Как написать фабричный шаблон в OSGi?
У меня есть несколько классов Impl, которые реализуют один и тот же сервис. Мне нужно написать один класс фабрики в OSGI, где я должен написать метод getter для возврата соответствующего объекта Impl. Ниже приведен код, который я пробовал. Я поражен в заводском классе. Есть идеи, чтобы продолжить?
public interface ServiceA {
public void display();
}
@Component (description = "Test1 service", ds = true, immediate = true)
@Service (value = {ServiceA.class})
class Test1 implements ServiceA{
public void display(){
Log.debug("Test1");
}
}
@Component (description = "Test2 service", ds = true, immediate = true)
@Service (value = {ServiceA.class})
class Test2 implements ServiceA{
public void display(){
Log.debug("Test2");
}
}
//How to write factory ?
class Factory{
public ServiceA getObject(String testType){
if(testType.equals("Test1")){
return Test1;
}
else{
return Test2;
}
}
}
0 ответов
Хотя неясно, как ваше приложение намеревается использовать эти различные реализации сервисов, один из способов сделать это - использовать свойства сервиса, а затем потребовать это свойство при фактической ссылке на эти сервисы у потребителя сервиса, например:
@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")));
}
// ...
}