第10章 与bundle一起工作
Gemini Blueprint提供了专用的schema元素用于与已存在的bundle进行交互或者安装新的bundle。虽然它不是故意要替换OSGi服务,但是bundle元素提供了一个简单的方式,即基于应用上下文的生命周期来执行bundle的动作。
bundle element定义的bean类型为 org.osgi.framework.Bundle。它提供了一种简单的方式来直接与bundle一起工作,包括驱动它们的生命周期。最简单的场景中,你只需要指定bundle的symbolic-name:
<bundle id="aBundle" symbolic-name="org.xyz.abundle"/>
现在bean aBundle可以被注入任何类型Bundle的属性。
如果需要的bundle还没有安装,你可以使用location属性来表明需要安装,利用action/destroy-action属性提供了声明式控制bundle的生命周期。location 属性用于指定bundle文件的URL。Action属性指定了bundle对象的生命周期操作。支持的动作值包括install、start、update、stop和uninstall。这些动作与Bundle接口中定义的名字具有相同的语义(参见OSGi服务平台核心规范),弱化前置条件允许抛出异常,例如为当前没有安装的bundle指定一个start动作(它将会首先进行安装)。
下表显示动作对Bundle状态的解释:
表10.1. <bundle> action值
Action | UNINSTALLED | INSTALLED/RESOLVED | ACTIVE |
START | 安装和启动bundle | 启动bundle | 无动作,bundle已经启动 |
UPDATE | 安装和更新bundle (Bundle.update()) | 更新bundle | 更新bundle |
STOP | 无动作 | 无动作 | 停止bundle |
UNINSTALL | 无动作 | 卸载bundle | 停止bundle,然后卸载它 |
例如:
<!-- ensure this bundle is installed and started --> <bundleid="aBundle"symbolic-name="org.xyz.abundle" location="http://www.xyz.com/bundles/org.xyz.abundle.jar" action="start"/> |
下表列出了bundle元素的属性名,可能的值和简短描述:
表10.2. <bundle>元素的属性
属性名 | 属性值 | 描述 | ||||
symbolic-name | 任意合法的symbolic-name字符串 | Bundle对象的symbolic name。通常用于与已经安装的bundle交互 | ||||
location | 可以转换为URL的字符串 | 用于安装、更新、识别bundle的位置 | ||||
action | start | stop | install | uninstall | update | 驱动bundle的生命周期动作。这个动作在启动时执行 |
destroy-action | 与action名字相同 | 驱动bundle的生命周期动作。这个动作在关闭时执行 |
Gemini Blueprint工程包含进一步支持virtual-bundle元素,它可以用于在线创建和安装OSGi的Bundle。