Подтвердить что ты не робот

Лучший способ получения контекста пакета OSGi?

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

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

4b9b3361

Ответ 1

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

См. FrameworkUtil JavaDoc.

Ответ 2

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

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

Ответ 3

Другая альтернатива - использовать Declarative Services, которая позволяет вам получать BundleContext в ваш метод активатора. Например, если вы используете Bnd Annotations для DS:

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

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

Ответ 4

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