0

在我见过的所有 iPOJO 示例中,@Bind@Unbind回调仅将服务实例作为参数,即

// @Requires
// private Foo foo;

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

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

蓝图还允许您拥有

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

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

iPOJO 回调也可以访问服务属性ServiceReference吗?还是应该为此使用白板处理程序?

4

1 回答 1

1

回调可以具有以下签名之一:

  1. 没有任何参数:方法只是一个通知(method())
  2. 使用服务对象:该对象是隐含的服务对象(方法(Service svc))
  3. 使用 OSGi 服务引用:服务引用出现或消失(方法(ServiceReference ref))
  4. 使用服务对象和 OSGi 服务引用(方法(Service svc, ServiceReference ref))
  5. 使用地图内的服务对象和服务属性(方法(服务 svc,地图属性))
  6. 使用字典中的服务对象和服务属性(方法(服务 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 特定对象(降低可测试性)。

于 2012-05-03T12:19:31.447 回答