Felix iPOJO annotation中@ServiceProperty、@StaticServiceProperty和@Property的区别

Apache Felix iPOJO

Apache Felix iPOJO

Felix的官方文档中有关Felix iPOJO annotation中@ServiceProperty、@StaticServiceProperty和@Property的区别和意义的解释很少,但是Apache Felix forum上面有,并有人有相同的问题高手进行了解答。另外在stackoverflow上面也有人回答了这个问题。

意思是:

  • @ServiceProperty会在service实例开放的时候一同开放出去,用来作为service registration的附带,在service被注册到osgi容器BundleContext中时,注册上这个属性和属性值,允许消费者instance或者component通过<properties/>过滤或者选择符合条件的service实例。
  • @StaticServiceProperty与@ServiceProperty很类似,都是可以在osgi容器BundleContext中根据这个property对service进行筛选的,只是它不用附着在一个field上,也正因为它不用附着于field,所以在配置时,它需要指定其类型type。
  • @Property则是service内部的属性,仅用来通过ipojo的配置来实现属性的初始值注入,不会开放出去,即外部的service不能根据这个属性进行service筛选。

见下面的代码和配置来看其用法和区别:

相当于是如下的xml配置:

从上面的配置可以看出,如果需要把某个属性开放到osgi容器的BundleContext(即在注册service实例的时候把属性也一起注册)就需要把属性配置在<provides/>标签中,表明这些属性是要开放给其他service实例进行过滤筛选使用的。注意:使用xml形式来配置component时,java类MyComponent中是没有static这个属性的任何信息的,xml中的这个属性仅仅是为了告诉ipojo,在注册这个component相关的instance时,把这个属性和instance配置的属性值一同注册,相当于是给这个instance实例打了这个属性的标签,其他实例需要用到这个实例时可以通过这个标签筛选出来。

instance的配置类似这样如下:

上面的instance配置,可以发现三种不同的property,在instance配置中是看不出区别的,配置方式完全相同。但是ipojo会根据其component中的信息来区分每个property的功能和作用范围。哪些property是用来给service注入值的;哪些是既注入值,有用来附带注册的;哪些仅用来附带注册的。

假设有一个类ClassRequireInstance,其中的一个field依赖了MyService接口,现在通过ipojo的配置注入这个testInstance的实例对象,看下面的ipojo配置:

上面的配置尽管对instan字段有一个复杂过滤条件,但是之前的配置的instance:testInstance仍然是满足条件的,因为testInstance的static和foo两个property跟随testInstance一起注册到BundleContext中了。filter过滤就相当于在BundleContext中进行过滤。当然过滤条件可以再宽松一点,比如:(static=My Value For Static)或者(foo=bar)。但是如果过滤条件中包含(array=1234)时,那instance classRequireInstance就找不到合适的MyService来注入了,因为array是一个仅用来做注入值的属性,不会注册到BundleContext中。

同理也可以直接写代码来从BundleContext中筛选获取testInstance:

这样就好理解了

Reference

 

Post Footer automatically generated by wp-posturl plugin for wordpress.