Лучший метод получения контекста OSGi-пакета? - PullRequest
34 голосов
/ 30 июня 2011

Каждый пакет в моем проекте OSGi имеет свой собственный BundleActivator, который я считаю нормальным. Это передается текущему BundleContext, который полезен для получения ссылок на сервисы и еще много чего.

Однако, как я могу получить BundleContext из классов в моем комплекте? Присвоение его общедоступному статическому полю в BundleActivator отстой и передача его в качестве аргумента также отстой. Есть ли более разумный способ?

Ответы [ 4 ]

51 голосов
/ 30 июня 2011

Вы можете использовать FrameworkUtil.getBundle(ClassFromBundle).getBundleContext().

См. FrameworkUtil JavaDoc .

17 голосов
/ 30 июня 2011

Хорошей практикой при разработке пакетов OSGi, на мой взгляд, является попытка написать связанный с OSGi код как можно более централизованным.Таким образом, если вы хотите использовать свой код в среде, отличной от OSGi, миграция будет минимальной.

Поэтому использование статических ссылок или FrameworkUtil повсеместно не очень хорошая идея, imho.Ни один не использует простую OSGi.Попробуйте взглянуть на iPOJO или Декларативные услуги.

11 голосов
/ 04 июля 2011

Другой альтернативой является использование декларативных сервисов, которые позволяют вам получить BundleContext в свой метод активатора.Например, если вы используете Bnd Annotations for DS:

@Activate
public void activate(BundleContext context) {
    // ...
}

Однако, как сказал RaduK, гораздо лучше, если вы можете написать большую часть кода в стиле POJO без использования OSGi API, таких как BundleContext.1004 *

0 голосов
/ 30 июня 2011

Здесь нет магии. Вам нужен какой-то способ предоставить информацию другим классам. Таким образом, он доступен либо через стек вызовов, либо в каком-то хорошо известном месте (например, в static).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...