Osgi Декларативная услуга условного связывания - PullRequest
8 голосов
/ 27 июля 2011

У меня есть такой сценарий, у меня есть три декларативных сервиса, которые предоставляют один и тот же интерфейс (скажем, интерфейс считывателя, и у меня есть readerimpl1-database-readerimpl2-flat file-readerimpl3-memory).Я хочу иметь потребителя, который привязывается только к реализации базы данных.В определении компонента мы даем ему имя, так что я почти уверен, что это имя есть в реестре, поэтому, если бы мне пришлось добавить метод активации, я мог бы искать в контексте компонента, используя имя.

Я хочупопробуйте через bind / unbind, используя имя сервиса в качестве параметра.Я почти уверен, что для этого можно использовать параметр "target" в элементе ссылки компонента, но я не нашел, как его использовать.

Кто-нибудь еще делал это?

Этобудет похоже на использование @Reference (mapped-name = "foo")

1 Ответ

14 голосов
/ 28 июля 2011

Цель - просто фильтр OSGi .Вы можете использовать его для фильтрации по любому свойству сервиса.Таким образом, если ваши сервисы имеют свойство с именем backend со значениями file или database, вы можете связать их со следующей целью:

<scr:reference ... target="(backend=database)"/>

И сервис с внутренним сервером базы данных будет зарегистрирован как1009 *

<scr:component ...>
    ...
    <property name="backend" type="String" value="database"/>
</scr:component>
...