Как получить фабрику iPojo на основе интерфейса, который она предоставляет

Если я хочу внедрить сервис в iPojo, используя метод инъекции, мне нужно сделать

@Bind
public void bindService(MyService implementation) {
}

Основываясь на типе аргумента, он знает, что подразумевается для внедрения только на основе интерфейса. Если есть два значения одного и того же интерфейса, он будет выбирать на основе некоторого алгоритма (сервисный ранг?)

Теперь, если мне нужно несколько экземпляров службы, которые должны быть созданы по требованию на основе события, я понимаю, что должен использовать org.apache.felix.ipojo.Factory и создавать экземпляры через него. У меня проблема в том, что я не нашел способ указать, какую фабрику вводить, используя только интерфейс экземпляров фабрики.

Другими словами

@Bind
public void bindService(org.apache.felix.ipojo.Factory myFactory) {
}

неоднозначно. Единственный способ, которым я нашел, чтобы получить заводскую инъекцию, использует @Bind(filter="(factory.name=myServiceFactoryImpl)" но это соединяет потребителя с конкретным провайдером, который побеждает весь смысл услуг OSGi. То, что я хочу сделать, это простым английским языком "привязать меня к фабрике, экземпляры которой реализуют интерфейс MyService". Если снова имеется много фабрик провайдеров с одним и тем же интерфейсом, он должен использовать тот же механизм устранения неоднозначности, что и при непосредственном внедрении экземпляров. Это возможно?

2 ответа

Решение

Просто используйте фильтр, используя component.providedServiceSpecifications список свойств интерфейса, предоставляемого созданными экземплярами:

@Requires(filter="(component.providedServiceSpecifications=org.acme.Foo)")
Factory[] factories;

Просто используйте заводской интерфейс, такой как MyServiceFactory одним методом MyService create();, Затем напишите реализацию MyServiceFactory и опубликуйте ее как сервис OSGi. Затем клиент может связать интерфейс MyServviceFactory и создать свои экземпляры службы.

Другие вопросы по тегам