Разрешенные подписи для методов iPOJO @Bind/@Unbind

Во всех примерах iPOJO, которые я видел, @Bind а также @Unbind обратные вызовы принимают в качестве аргумента только экземпляр службы, т.е.

// @Requires
// private Foo foo;

@Bind
public void bindFoo(Foo foo) { ... }

@Unbind
public void unbindFoo(Foo foo) { ... }

Blueprint также позволяет вам иметь

public void bindFoo(ServiceReference reference) { ... }

public void bindFoo(Foo foo, Map<String, Object> properties) { ... }

Могут ли обратные вызовы iPOJO также получить доступ к свойствам службы или ServiceReference? Или вместо этого должен использоваться обработчик доски?

1 ответ

Решение

Обратные вызовы могут иметь одну из этих подписей:

  1. Без каких-либо аргументов: метод является просто уведомлением (method ())
  2. С сервисным объектом: объект является вовлеченным сервисным объектом (метод (Service svc))
  3. С ссылкой на сервис OSGi: ссылка на сервис появляется или исчезает (метод (ссылка на сервис))
  4. С объектом службы и ссылкой на службу OSGi (метод (Service svc, ServiceReference ref))
  5. С объектом службы и свойствами службы внутри карты (метод (Service svc, Свойства карты))
  6. С объектом службы и свойствами службы внутри словаря (метод (Service svc, Свойства словаря))

Итак, поддерживаются:

@Bind
public void bind() { ... }

@Bind
public void bind(Service svc) { ... }

@Bind
public void bind(ServiceReference ref) { ... }

@Bind
public void bind(Service svc, ServiceReference ref) { ... }

@Bind
public void bind(Service svc, Map properties) { ... }

@Bind
public void bind(Service svc, Dictionary properties) { ... }

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

Другие вопросы по тегам