允许iPOJO @ Bind / @ Unbind方法的签名

时间:2012-05-02 16:21:31

标签: osgi ipojo blueprint-osgi

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

// @Requires
// private Foo foo;

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

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

蓝图also allows you to have

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

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

iPOJO回调是否也可以访问服务属性或ServiceReference?或者应该使用whiteboard handler代替呢?

1 个答案:

答案 0 :(得分:1)

回调可以包含以下签名之一:

  1. 没有任何参数:该方法只是一个通知(method())
  2. 使用服务对象:对象是涉及的服务对象 (方法(服务svc))
  3. 使用OSGi服务引用:服务 引用出现或消失(方法(ServiceReference ref))
  4. 使用服务对象和OSGi服务引用 (方法(服务svc,ServiceReference ref))
  5. 使用Map中的服务对象和服务属性(方法(服务svc,Map property))
  6. 使用Dictionary中的服务对象和服务属性(方法(服务svc,字典属性))
  7. 所以,支持:

    @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特定对象(降低可测试性)。