这里是对上一篇blog: http://winseclone.iteye.com/blog/1786637 的补充。说明DS声明服务XML中reference节点属性的作用。
这里reference的几个属性cardinality和policy是比较难理解的。
cardinality(基数),该属性是DS为啥这么牛逼的真正所在之一。该属性控制Service数量的上下限,达到这个下限后该Component才可用。
这里说一下“上限”,假设选的是0..1或1..1,就算你的运行时注册了n个Service,框架也只会选择其中一个!至于真正使用那个,不是很确定!所以最好不要这样用!
- 0..1: optional and singular, "zero or one"
- 1..1: mandatory and singular, "exactly one"
- 0..n: optional and multiple, "zero to many"
- 1..n: mandatory and multiple, "one to many" or "at least one"
上限是1的情况下,找到一个Service后就被break了!所以,在这种“基数”的配置下,不推荐注册多个Service。如果需要运行时替换服务,首先stop原来的服务插件,然后再start新服务的插件。
在0..1或1..1的策略下,也不推荐在Component(Helper)的插件同时绑定一个Service实现,不利于服务的替代!
policy(策略)可选值为:static和dynamic, 静态和动态的意思。如果是静态的话,如果Service重新加载,Component也会重新加载。而dynamic只会调用相应的setService()和unsetService()方法。
activate sample.http.ds.UserHelper@48cbd6
osgi> ls
All Components:
ID State Component Name Located in bundle
1 Active sample.http.ds.UserHelper sample.http(bid=41)
2 Active sample.http.en.userService sample.http.ds.user.en(bid=44)
3 Active sample.http.cn.userService sample.http.ds.user.cn(bid=45)
osgi> stop 45
register user-service : sample.http.ds.user.en.UserServiceImpl@406c4
unregister user-service : sample.http.ds.user.cn.UserServiceImpl@19e5e6b
注意: 这里的顺序!先register后再unregister!所以原来的UserHelper需要进行修改才行,不然,动态变更后,service就变成null咯!
activate sample.http.ds.UserHelper@1526a45
osgi> ls
All Components:
ID State Component Name Located in bundle
1 Active sample.http.ds.UserHelper sample.http(bid=41)
2 Active sample.http.en.userService sample.http.ds.user.en(bid=44)
3 Active sample.http.cn.userService sample.http.ds.user.cn(bid=45)
osgi> stop 45
deactivate sample.http.ds.UserHelper@1526a45
unregister user-service : sample.http.ds.user.cn.UserServiceImpl@18f07f1
register user-service : sample.http.ds.user.en.UserServiceImpl@5c8c05
activate sample.http.ds.UserHelper@1ecade2
从上面两个从Console命令窗口中的可以看到,dynamic策略在Service注册后,不会deactivate钝化Component。而static策略会先钝化Component后在unregsiter注销Service。
相关推荐
### CANOpen规范V1.1 – DS202-2.pdf关键知识点解析 #### 一、概述 **标题**:“CANOpen Specification V1.1 - DS202-2.pdf”这一文档主要介绍了用于工业应用的CAN(Controller Area Network)应用层规范。此文档...
头信息存储了图纸的基本属性,如单位、版本等;图块部分定义了可重复使用的图形元素;实体部分包含了构成图形的各种对象,如线、圆、文字等;表格部分则定义了颜色、线型、图层等参数;最后的EOF标记表示文件的结束...
模块定义服务依赖和生命周期行为,Blueprint容器负责解析配置并管理服务。 3. **SpringDM**: Spring Dynamic Modules (SpringDM) 将Spring框架的依赖注入和配置管理能力引入到OSGi环境中。模块可以通过Spring配置...
##### 1.1.2 解析Bundle运行环境 在创建好Bundle后,我们需要理解Bundle的生命周期以及它是如何在OSGi平台上运行的。 - **Bundle状态**:包括未安装、已安装、已解压缩、已解决依赖、活动状态等。 - **Bundle上...
本文将深入解析通过Java进行数据库连接的一种常见方法——利用JNDI(Java Naming and Directory Interface)与DataSource对象,结合Tomcat服务器环境下的配置过程。 ### JNDI与DataSource简介 JNDI是一种Java API...
- **元件属性设置**: 在设计过程中,对于每一个元件的属性都需要进行详细的设置,尤其是参考编号(Reference Designator)等关键信息。 - **BOM(物料清单)生成**: 在生成BOM时,应注意设置正确的格式,例如使用Tab...