Разрешенные подписи для методов 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 ответ
Решение
Обратные вызовы могут иметь одну из этих подписей:
- Без каких-либо аргументов: метод является просто уведомлением (method ())
- С сервисным объектом: объект является вовлеченным сервисным объектом (метод (Service svc))
- С ссылкой на сервис OSGi: ссылка на сервис появляется или исчезает (метод (ссылка на сервис))
- С объектом службы и ссылкой на службу OSGi (метод (Service svc, ServiceReference ref))
- С объектом службы и свойствами службы внутри карты (метод (Service svc, Свойства карты))
- С объектом службы и свойствами службы внутри словаря (метод (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 (уменьшите тестируемость).