采购风险控制:spring+osgi 动态模型三:服务注册表(The Service Registry)续

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 09:18:03
2、定义OSGi服务的引用

  • 引用单独的服务
reference元素被用于定义引用服务注册表里的一个服务。
interface属性定义了服务必须匹配的服务接口。例如下面的声明创建了一个编号为messageService的Bean,它被从服务注册表中查询到的一个提供MessageService接口的服务支持。

和service声明一样,如果要指定多个接口,使用嵌套的interfaces元素来替换interface属性。


com.xyz.MessageService
com.xyz.MarkerInterface


  • 关于filter属性
可选属性filter可以用于指定一个OSGi过滤器表达式和限定服务注册表只查询那些符合给定的filter的服务。
例如:
filter="(asynchronous-delivery=true)"/>
上面的声明会仅仅匹配声明了Messageservice接口而且具有一个asynchronous-delivery属性为true的服务。
  • 关于bean-name属性
bean-name属性可以用于方便地指定一个过滤表达式:在使用service元素输出服务时(见5.1输出Spring bean作为OSGi服务),会自动设置一个bean-name属性的值,该要与之匹配。例如:
bean-name="defaultMessageService"/>
上面的声明会仅匹配一个实现MessageService接口且具有org.springframework.osgi.bean.neam属性值为defaultMessageService 的OSGi服务。简言之这意味着所有查找所有Spring-DM所输出的实现了MessageService接口且名为defaultMessageService 的bean。
  • 关于cardinality属性
cardinality属性被用于指定是否一个匹配的服务总是必需的。属性值为1..1(默认)表示必须总有一个匹配的服务。值为0..1表示匹配的服务并不总是必需的(详见4.2.1.6)。一个具有值为1..1的cardinality属性的reference总是作为一个强制的服务引用,默认地,应用程序上下文创建会被延迟,直到引用变成satisfied状态。
注意
如果服务由同一个bundle输出,那么声明到该服务的强制引用是错误的,这种行为会造成应用程序上下文由于死锁或超时而创建失败。
  • 关于depends-on属性
depends-on属性被用于指定只有被依赖的bean被实例化后,服务引用才能从服务注册表里找到。
  • 关于context-class-loader属性
context-class-loader 属性的可选值包括:
client:默认值,在服务调用时会确保在调用者 bundle 的 classpath 上的类
型都会对 context class loader 可见。
 service-provider:在服务调用时,会确保输出服务的 bundle 的 classpath
上的所有类型都会对 context class loader 可见。
unmanaged:在服务调用时不会进行 context class loader 管理
  • 获取一个受控服务的引用
public class BeanWithServiceReference{
private ServiceReference serviceReference;
private SomeService service;//get and set method...

}


--1
--2


--1自动将受管理的服务转换成ServiceReference
 --2受管服务被原样注入
  • 引用一个服务集

由bean定义的集合的成员会由spring动态管理,注册表里的匹配用力注册或注销时,集合里的成员会随之更新。集合里的所有成员 都支持相应的注册服务接口,并且 对于bundle都是可见的。