В чем разница между компонентами и сервисами OSGi
В OSGi, каковы основные различия между Компонентами и Сервисами? Насколько я понимаю, все Сервисы должны быть Компонентами, но не все Компоненты должны быть Сервисами.
Каковы преимущества использования одного над другим с примерами использования?
2 ответа
"Компоненты" менее формально определены, чем услуги.
Служба - это любой объект, который зарегистрирован в реестре служб OSGi и может быть найден с помощью имен интерфейсов. Единственным условием является то, что сервис должен реализовывать некоторый интерфейс... любой интерфейс. Например, я мог бы зарегистрировать работающий объект под java.lang.Runnable
интерфейс, и клиенты могут искать его, используя это имя интерфейса.
"Компонент", как правило, является объектом, жизненный цикл которого управляется, как правило, компонентной структурой, такой как декларативные службы (DS), Blueprint или iPOJO. См. Эту страницу в вики-сообществе OSGi для обсуждения различных доступных компонентов.
Компонент может иметь любую из следующих функций, в сочетании или отдельно:
- Компонент может быть запущен и остановлен; это будет считаться "активным" компонентом, хотя это также неформальный термин. Компонент, который не нужно запускать или останавливать, называется пассивным.
- Компонент может опубликовать себя как сервис OSGi.
- Компонент может связываться или использовать службы OSGi.
В общем, использование инфраструктуры компонентов - это самый простой способ работы со службами OSGi, поскольку платформа будет управлять связыванием со службами, которые вы хотите использовать. Например, вы можете сказать, что ваш компонент "зависит" от конкретной службы, и в этом случае компонент будет создан и активирован только тогда, когда эта служба доступна, а также он будет уничтожен, когда служба станет недоступной.
РЕДАКТИРОВАТЬ: см. Ответ Нила Бартлетта, я ответил довольно определенно в отношении декларативных услуг, но это более тонко, чем я неправильно сказал здесь.
Вкратце: Компоненты являются потребителями услуг, а не провайдерами, Услуги являются расширением Компонентов, зарегистрированных в качестве поставщиков услуг.
Компонент имеет жизненный цикл (деактивация и изменение), управление зависимостями сервисов (un/bind).
Сервис является расширением компонента; через реестр сервисов он предлагает свои сервисы другим пакетам и т. д., публикуя реализованные интерфейсы и свойства.
Вариант использования для Сервисов очевиден, типичные случаи использования Компонентов требуют управления жизненным циклом, конфигурацией или зависимостями сервисов, но не требуют / не хотят публиковать Компонент для использования между пакетами.