Лучший метод получения контекста OSGi-пакета?
Каждый пакет в моем проекте OSGi имеет свой собственный BundleActivator, который я считаю нормальным. Это передается текущему BundleContext, который полезен для получения ссылок на сервисы и еще много чего.
Тем не менее, из классов в моем комплекте, как я могу получить BundleContext? Присвоение его общедоступному статическому полю в BundleActivator отстой и передача его в качестве аргумента также отстой. Есть ли более разумный способ?
4 ответа
Ты можешь использовать FrameworkUtil.getBundle(ClassFromBundle).getBundleContext()
,
На мой взгляд, при разработке комплектов OSGi рекомендуется стараться писать код, связанный с OSGi, как можно более централизованным. Таким образом, если вы хотите использовать свой код в среде, отличной от OSGi, миграция будет минимальной.
Поэтому использование статических ссылок или FrameworkUtil повсеместно не очень хорошая идея imho. Ни один не использует простую OSGi. Попробуйте посмотреть на iPOJO или Декларативные услуги.
Другой альтернативой является использование декларативных сервисов, которые позволяют вам получить BundleContext в свой метод активатора. Например, если вы используете Bnd Annotations for DS:
@Activate
public void activate(BundleContext context) {
// ...
}
Однако, как сказал RaduK, гораздо лучше, если вы можете написать большую часть кода в стиле POJO без использования OSGi API, таких как BundleContext.
Здесь нет магии. Вам нужен какой-то способ предоставить информацию другим классам. Так что он доступен либо через стек вызовов, либо в каком-то известном месте (например, в статическом).