资源描述
文件编号:P01-01 分 册 号:1/1 页 码:52 密 级:C InforGuard 项项目目 开开发发手手册册 中创软件商用中间件股份有限公司 2010 年 05 月 变变更更记录记录 变更版本日期图表、表格、段落号 A/M/D 原因与修改情况描述修订人审核人 1.02010-1-1ALLA创建文档李铭 注:A 增加 M 修改 D 删节 目录 核高基 6-1 项目 使用手册 I 目目录录 第第 1 章章 概述概述.1 1.1. 开发场景.1 1.2. 基本概念.1 第第 2 章章 搭建开发环境搭建开发环境.2 2.1. 准备开发工具.2 2.2. 工具安装及环境配置.2 2.2.1. 安装jdk及配置java环境2 2.2.2. 安装maven及配置仓库.3 2.2.3. Eclipse中安装m2eclipse插件4 2.2.4. Eclipse中安装RAP开发环境4 2.2.5. Eclipse中安装国际化编辑插件5 2.2.6. Eclipse中导入编码样式5 2.2.7. 设置Eclipse的默认编码5 第第 3 章章 开发案例开发案例.7 3.1. 开发前准备.7 3.2. 组织结构.7 3.2.1. 目录结构.7 3.2.2. 源码组织.8 3.3. 开发流程.8 3.3.1. 建立Eclipse插件工程8 3.3.2. 添加依赖.9 3.3.3. 添加导出包.10 3.3.4. 开发声明式服务(DService)11 第第 4 章章 常见问题解答常见问题解答.23 第第 5 章章 参考参考.24 附录一附录一 SETTING.XML.25 附录二附录二 常用动名词常用动名词.33 附录三附录三 本地化资源文件的创建方法本地化资源文件的创建方法.34 附录四附录四 MANIFEST.MF 35 附录五附录五 POM.XML.36 附件六附件六 OSGI 命令说明命令说明.39 目录 核高基 6-1 项目 使用手册 II 附件七附件七 METADATA.XML.41 概述 核高基 6-1 项目 使用手册 1 章 1 章 概概述述 该文档是为 InforGuard UTMP 开发人员开发新功能所编写的规范性文档。 1.1. 开开发发场场景景 当 UTMP 添加新的功能时,开发人员可以根据该文档更快更有效的进行开发。 1.2. 基基本本概概念念 OSGi:OSGi(JSR 291)也叫 Java 语言的动态模块系统,它为模块化应用的开发定义了一个 基础架构。OSGi 容器已有多家开源实现,比如 Knoflerfish、Equinox 和 Apache 的 Felix。 更多信息可以访问: http:/www.osgi.org/Main/HomePage、http:/ Equinox:Equinox 是 Eclipse 中的项目之一,Equinox 是作为 OSGI R4 RI 而知名的,同时 由于 Equinox 有 Eclipse IDE 这么个成功案例,反应出了 Equinox 作为 OSGI 框架的优势。 更多信息可以访问:http:/www.eclipse.org/equinox/、http:/www.riawork.org/。 Bundle:OSGi 服务框架定义的模块化单元,称之为一个 Bundle。一个 Bundle 由 java 的类 和其他资源组成,可以为终端用户提供功能。Bundle 的描述信息存放在一个 manifest 文件 中,这个文件包含在 JAR 文件中的 META-INF 目录下,命名为 MANIFEST.MF。通过 Bundle 的符号名称和版本号可以在框架中惟一的确定一个 Bundle。 Eclipse RAP: Eclipse RAP 项目的目的是让开发人员能够利用 Eclipse 开发模型来构建 Rich,Ajax-enabled Web 应用程序。主要运用著名的 Eclipse 平台扩展点插件机制和一个包 含 SWT/JFace API 的 widget 工具包。RAP 项目旨在使开发人员能够使用 Eclipse 开发模 型构建富 Internet 应用程序。RAP 允许开发人员使用丰富的 Java 库和 Eclipse API 构 建基于浏览器的 Ajax 应用程序。它通过提供 SWT、JFace 和 Eclipse Workbench 的基于 Web 的实现来提供此项功能。 更多 RAP 信息可访问:http:/www.eclipse.org/rap/。 搭建开发环境 核高基 6-1 项目 使用手册 2 章 2 章 搭搭建建开开发发环环境境 2.1. 准准备备开开发发工工具具 JDK 1.5 或以上版本,下载地址: ftp:/192.168.51.11/Tools/Program/JDK/jdk-1_5_0_16-windows-i586-p.exe/ Maven 2.0.9 或以上版本,下载地址: ftp:/192.168.51.11/Tools/Program/maven/apache-maven-2.2.1-bin.zip Eclipse 3.5 或以上版本,下载地址: ftp:/192.168.51.11/Tools/Program/%B1%E0%BC%AD%C6%F7/Eclipse/eclipse-java-galileo- SR2-win32.zip 注:192.168.51.11 的用户名/密码:user/123 2.2. 工工具具安安装装及及环环境境配配置置 2.2.1. 安装安装 jdk 及配置及配置 java 环环境境 1.安装 Windows 操作系统上的 JDK 安装程序是一个 exe 可执行程序,直接安装即可,在安装过程中 可以选择安装路径以及安装的组件等,如果没有特殊要求,选择默认设置即可。程序默认的安装路 径在 C:Program FilesJava 目录下。 2.环境变量设置: 配置步骤为: 1)右击“我的电脑”,点击“属性”:选择“高级”选项卡,点击“环境变量”。 2)在“系统变量”中,设置 3 项属性,JAVA_HOME,PATH,CLASSPATH(不分大小写) JAVA_HOME 指明 JDK 安装路径,假设 JDK 的版本为 1.6.0_16,安装路径为默认路 径, 则该值应设为 C:Program FilesJavajdk1.6.0_16,此路径下包括 lib,bin,jre 等 文件夹(此变量最好设置,因为以后运行一体化管理平台,eclipse 等都需要此变量) ; PATH 使得系统可以在任何路径下识别 java 命令,设为:%JAVA_HOME%bin; CLASSPATH 为 java 加载类(class or lib)路径,只有类在 classpath 中,java 命令才能 识别,设为:.;%JAVA_HOME%libdt.jar;%JAVA_HOME%libtools.jar (要加.表示当 前路径),%JAVA_HOME%就是引用前面指定的 JAVA_HOME。 3.验证安装成功: 1)打开“开始”“运行” cmd java version 屏幕输出 java 版本信息说明安装成功,否则说明配置错误,需要重新进行配置。 搭建开发环境 核高基 6-1 项目 使用手册 3 2.2.2. 安装安装 maven 及配置及配置仓库仓库 1.安装 1)下载并解压至想要安装的目录 2)设置 Maven 系统环境变量,例如:MAVEN_HOME=E:apache-maven 3)添加%MAVEN_HOME%bin 至系统环境变量 PATH 中。 4)确认 Maven 的安装: cmd mvn version 屏幕输出 maven 版本说明安装成功。 2.配置本地 Repository 本地 Repository 的默认值是$user.home/.m2/repository/。可以在 user configuration(即在 $MAVEN_HOME/conf/setting.xml)中改变本地 Repository 的位置。例如本地仓库的位置在硬盘 的位置为:E:Repository。在 setting.xml 可以进行如下配置: E:Repository 注意:本地 Repository 必须是绝对路径。 3.配置代理 可以在 user configuration(即在$MAVEN_HOME/conf/setting.xml)中配置代理,配置如下: cvicseproxy true http 192.168.2.20 80 localhost releases admin loong2009 snapshots admin loong2009 搭建开发环境 核高基 6-1 项目 使用手册 4 Trustie Repository1 central Human Readable Name for this Mirror. http:/58.20.54.58/content/groups/treleases Trustie Snapshots Repository1 public-snapshots Human Readable Name for this Mirror. http:/58.20.54.58/content/groups/tsnapshots 注:setting.xml 配置文件见附件一 2.2.3. Eclipse 中安装中安装 m2eclipse 插件插件 在 eclipse 中选择Help Install New Software .,在弹出的 Install 对话框的 Work with 文本框中 添加 m2eclipse 插件的安装地址 http:/m2eclipse.sonatype.org/sites/m2e,选择“Maven Integration for Eclipse (Required)”进行安装。 安装完成之后需要在 eclipse 中自行指定在本机中 maven 的 Repository 位置。打开 window/proferences 菜单,点击 maven 配置项的 Installations,去掉默认的 launch maven,添加机器 上的 maven 并选择使用,点击 maven 配置项的 user settings,选择$MAVEN_HOME /conf/setting.xml 文件,完成配置。 2.2.4. Eclipse 中安装中安装 RAP 开开发环发环境境 打开 Eclipse,选择Help Install New Software . 菜单。 在弹出的 Install 对话框的 Work with 文本框中输入 RAP 的安装地址,如 1.3 版本为: http:/download.eclipse.org/rt/rap/1.3/tooling。 选择列表中出现的 Rich Ajax Platform 并点击下一步。 在详细页面点击下一步。 在许可证页面选择同意并点击完成按钮。 安装完成后确认重启 Eclipse。 Eclipse 重启后会出现欢迎页面,选择 Rich Ajax Platform(RAP) 选择 Install Target Platform 选择确定按钮。 搭建开发环境 核高基 6-1 项目 使用手册 5 2.2.5. Eclipse 中安装国中安装国际际化化编辑编辑插件插件 打开 Eclipse,选择Help Install New Software . 菜单。 在弹出的 Install 对话框的 Work with 文本框中输入 Jinto 的安装地址: http:/www.guh- software.de/eclipse/。 选择列表中出现的 OpenSource Tools 并点击下一步。 在详细页面点击下一步。 在许可证页面选择同意并点击完成按钮。 安装完成后确认重启 Eclipse。 2.2.6. Eclipse 中中导导入入编码样编码样式式 打开 Eclipse,选择Window PreferencesJavaCode StyleCode Templates 菜单。 点击界面右面的 Import 按钮,选择 IDCcodetemplates.xm 文件,点击 Apply 按钮。 当新建 Java 接口/类时,需要选择 Generate comments,如下图: 2.2.7. 设设置置 Eclipse 的默的默认编码认编码 打开 Eclipse,选择Window PreferencesGeneralWorkspace菜单。 在 Text file encoding 中选择 Other,并且把编码改成 UTF-8。 开发案例 核高基 6-1 项目 使用手册 6 章 3 章 开开发发案案例例 3.1. 开开发发前前准准备备 参照第 2 章搭建好开发环境。 3.2. 组组织织结结构构 3.2.1. 目目录结录结构构 目录目录说明说明 Cloud-UI界面原型的 WEB 工程 Cloud-FlexFlex 开发工程 Cloud -web 存放展示层构件工程 user-management 存放用户管理工程 3.2.2. 源源码组织码组织 本项目主要的包结构如下:com.cvicse.inforguard.utmp.模块名.构件名.分组名 3.3. 开开发发流流程程 3.3.1. 建立建立 Eclipse 插件工程插件工程 启动 Eclispe, 从 Eclispe 的 File 菜单创建一个 Eclipse 插件工程,File New Project Plug-in Development Plug-in Project,输入工程名 cloud-userman-impl,选择合适的工程目录,点 击 next,进入 Plug-in Project 向导,配置完成后点击 Finish,完成建立工作。 开发案例 核高基 6-1 项目 使用手册 7 参考上图设置,点击 Finish 按钮完成工程创建。 注意:(1)由于我们开发的是第一个版本,所以 Version 先写成 0.0.1。(2)需要把”Generate an activator, a Java class that controls the plug-ins life cycle”取消勾选状态。(3)如果开发的是 Web 插件,需要把”This plug-in will make contributions to the UI”勾选上。 3.3.2. 添加依添加依赖赖 用 Plug-in Manifest Edit 打开 MANIFEST.MF 文件,切换到 Dependecies 视图,如下图。 在 Required Plug-ins 中加入依赖的插件。 在 Imported Packages 中加入依赖的包。 开发案例 核高基 6-1 项目 使用手册 8 3.3.3. 添加添加导导出包出包 用 Plug-in Manifest Edit 打开 MANIFEST.MF 文件,切换到 Runtime 视图,如下图: 在 Exported Packages 中添加要导出的包。 开发案例 核高基 6-1 项目 使用手册 9 3.3.4. 开开发发声明式服声明式服务务(DService) 在这里我们将开发一个简单的例子,这个例子包括以下部分: 发布一个 OSGi 服务。 引用一个 OSGi 服务。 使用构件实例生命周期控制方法来激活和去活构件实例。 为了举例说明 DService 功能,我们将开发一个简单的程序来展现它。这个例子包括 3 个 Bundle, 其一是服务接口(Hello Service),对应 POJO project 其二是服务实现,作为一个单独的构件位于单独的 Bundle 中,并且该构件提供 OSGi 服务 (POJO-Impl),对应 POJO-Impl project 其三是服务使用方,也是作为一个单独的构件位于单独的 Bundle 中,并且该构件需要使用 Hello Service 接口的 OSGi 服务,对应 POJO Client project。 首先,创建一个 hello-api 的服务接口工程(创建过程见 3.3.1. ),添加一个接口类: com.cvicse.inforguard.utmp.example.hello.IHello,代码如下: /* * * InforGuard Copyright 2010 CVICSE, Co.ltd . * All rights reserved. * * Package: com.cvicse.inforguard.utmp.example.hello 开发案例 核高基 6-1 项目 使用手册 10 * FileName: IHello.java * */ package com.cvicse.inforguard.utmp.example.hello; /* * * 描述: * * 服务接口 * * 创建日期 2010-6-1 * * author li_ming * version 1.0 * */ public interface IHello /* * 打招呼 * param name 姓名 * return 打招呼语句 */ public String sayHello(String name); 使 hello-api 工程支持 Maven,操作如下图: 开发案例 核高基 6-1 项目 使用手册 11 点击“Enable Dependency Managerment”,弹出配置界面,填写如下: 填写完后,点击“Finish”,这时候 pom.xml 文件会报错,你需要把下面的代码加入 pom.xml 开发案例 核高基 6-1 项目 使用手册 12 的标签后面: org.codehaus.mojo build-helper-maven-plugin 1.1 add-source generate-sources add-source src org.apache.felix maven-bundle-plugin 2.0.0 true $pom.artifactId com.cvicse.inforguard.utmp.example.hello 开发案例 核高基 6-1 项目 使用手册 13 pom.xml 中各标签的详细说明见附录五。 双击 MANIFEST.MF,在 Runtime 中把 com.cvicse.inforguard.utmp.example.hello 包暴露出来, 详见 3.3.3. 。 接下来只需要在 eclipse 中右击工程或者 pom 文件,选择 run as maven install 即完成工程的构建 工作。当 maven 报告INFO BUILD SUCCESSFUL 则 Hello Service 服务构件的 jar 包已经安装到 maven 的本地库中,同时生成一个副本位于工程根目录的 target 下。 第二步创建 Hello 接口的实现工程:hello-impl,双击 MANIFEST.MF,在 Dependencies 中添加 hello-api 插件的依赖,详见 3.3.2. 。 添加一个 IHello 接口的实现类:com.cvicse.inforguard.utmp.example.hello.impl. HelloImpl,代码 如下: /* * * InforGuard Copyright 2010 CVICSE, Co.ltd . * All rights reserved. * * Package: com.cvicse.inforguard.utmp.example.hello.impl * FileName: HelloImpl.java * */ package com.cvicse.inforguard.utmp.example.hello.impl; import com.cvicse.inforguard.utmp.example.hello.IHello; /* * * 描述: * * 服务的实现 * * 创建日期 2010-6-1 * * author li_ming * version 1.0 * */ public class HelloImpl implements IHello /* 开发案例 核高基 6-1 项目 使用手册 14 * 构造函数 */ public HelloImpl() System.out.println(“HelloImpl starting“); /* (non-Javadoc) * see com.cvicse.inforguard.utmp.example.hello.IHello#sayHello(java.lang.String) */ public String sayHello(String name) String result = “hello “ + name; return result; 为了能够管理这些构件和让 DService 框架识别我们写的 pojo 并将之发布为 Hello 的 OSGi 服务, 我们还必须要定义一个元数据文件,名称为 metadata.xml(详见附件七),位于本 project 的根目录下。 其内容如下: Component 节点声明了一个构件,classname 声明了该构件实现类,immediate 声明该构件不是 即时构件,也就是说当 OSGi 框架中发现需要该服务时才实例化该构件。 Component 下的 service 节点表示本构件会以构件实例为服务对象对外提供 OSGi 服务,服务的 接口默认暴露出当前构件实现的所有接口,也可以在 service 节点下加入 provide 节点来决定该暴露 的详细的接口,以及对应的服务属性等,详见附件七。 Instance 节点表示在当前构件在运行时被 DService 框架初始化完毕之后,根据配置来确定实例 化构件的次数,即有多少个 Instance 就会有多少个构件实例(注意不是指服务对象)。 源代码和元数据定义完成之后,还需要使 hello-impl 工程支持 Maven,并修改 pom.xml: org.codehaus.mojo build-helper-maven-plugin 开发案例 核高基 6-1 项目 使用手册 15 1.1 add-source generate-sources add-source src org.apache.felix maven-bundle-plugin 2.0.0 true $pom.artifactId com.cvicse.inforguard.utmp.example.hello.impl metadata.xml org.trustie.loong.modules.loong-dservice loong-dservice-plugin 1.0.0 开发案例 核高基 6-1 项目 使用手册 16 dservice-bundle com.cvicse.inforguard.utmp.example hello-api 0.0.1 bundle 本 project 所有工作做完之后,同样只需要在 eclipse 中右击 project,Run as Maven install,maven 会为我们将 project 打包成为 DService Bundle 安装到 maven 本地库中,并在 target 目 录下生成同样一份 jar 文件。 最后建立一个服务消费工程 hello-client,双击 MANIFEST.MF,在 Dependencies 中添加 com.cvicse.inforguard.utmp.example.hello的依赖,详见 3.3.2. 。 添加一个服务使用类:com.cvicse.inforguard.utmp.example.hello.client.HelloClient,代码如下: /* * * InforGuard Copyright 2010 CVICSE, Co.ltd . * All rights reserved. * * Package: com.cvicse.inforguard.utmp.example.hello.client * FileName: HelloClient.java * */ package com.cvicse.inforguard.utmp.example.hello.client; import com.cvicse.inforguard.utmp.example.hello.IHello; /* * 开发案例 核高基 6-1 项目 使用手册 17 * 描述: 服务消费类 * 创建日期 2010-6-1 * author li_ming * version 1.0 * */ public class HelloClient implements Runnable /* * 两个调用之间的延迟。 */ private static final int DELAY = 5000; /* * Hello 服务。 * 通过容器注入。 * */ private IHello m_hello; / 需要引用的服务。 /* * 结束标志。 */ private boolean m_end = false; /* * 名称属性。 * 通过容器注入。 */ private String m_name; public HelloClient() System.out.println(“HelloClient starting“); /* * Run 方法。 * see java.lang.Runnable#run() */ public void run() while (!m_end) try invokeHelloServices(); 开发案例 核高基 6-1 项目 使用手册 18 Thread.sleep(DELAY); catch (InterruptedException ie) /* 将重新检查 */ /* * 调用 hello 服务。 */ public void invokeHelloServices() for (int i = 0; m_hello != null leave empty if not used. releases admin loong2009 snapshots admin loong2009 mirrorId repositoryId Human Readable Name for this Mirror. http:/ Trustie Repository1 central Human Readable Name for this Mirror. http:/58.20.54.58/content/groups/treleases Trustie Snapshots Repository1 public-snapshots Human Readable Name for this Mirror. http:/58.20.54.58/content/groups/tsnapshots | or the command line, profiles have to have an ID that is unique. | | An encouraged best practice for profile identification is to use a consistent 附录一 SETTING.XML 核高基 6-1 项目 使用手册 29 naming convention | for profiles, such as env-dev, env-test, env-production, user- jdcasey, user-brett, etc. | This will make it more intuitive to understand what the set of introduced profiles is attempting | to accomplish, particularly when you only have a list of profile ids for debug. | | This profile example uses the JDK version to trigger activation, and provides a JDK-specific repo. jdk-1.4 1.4 jdk14 Repository for JDK 1.4 builds http:/ default always | org.myco.myplugins | myplugin | 附录一 SETTING.XML 核高基 6-1 项目 使用手册 30 | | $tomcatPath | | | . | | NOTE: If you just wanted to inject this configuration whenever someone set target-env to | anything, you could just leave off the inside the activation- property. | env-dev target-env dev /path/to/tomcat/instance alwaysActiveProfile anotherAlwaysActiveProfile 附录二 常用动名词 核高基 6-1 项目 使用手册 31 附附录录二二 常常用用动动名名词词 常用名称:常用名称: 用户user角色role 知识库knowledge流程workflow 策略rule 资产asset 报表report 工单order 配置config组group 代理agent 视图view 区域zone 机房machine room 线line节点node 机架frame 动作action 风险risk 拓扑topology 模板template中心center 适配器adapter 权限popedom 日志log 状态state 威胁threat 常用动词:常用动词: 添加add 删除del 修改modify 查询(返回一个对象)load 查询(返回一组对象且查 询包含过滤条件) query枚举enum 分析analyse 统计stat 关联correlate评估assess 获取get设置set 附录三 本地化资源文件的创建方法 核高基 6-1 项目 使用手册 32 附附录录三三 本本地地化化资资源源文文件件的的创创建建方方法法 首先需在 Eclipse 中安装 JInto 插件,安装地址为 http:/www.guh-software.de/eclipse/。 在 src 中新建一个 ResourceBundle File 文件 打开的对话框中 设置属性文件前缀名 name 比如 eventInfo 选择 language Chinese 选择 Country China 点击添加,添加一个文件为 eventInfo_zh_CN.properties 之后可以多次选择 language conntry 点击添加 创建多个 properties 文件 点击完成 finish 打开刚才创建的文件 Keys 列设置键 Chinese(china)列设置相应的值 附录四 MANIFEST.MF 核高基 6-1 项目 使用手册 33 附附录录四四 MANIFEST.MF Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-Vendor: %Bundle-Vendor Bundle-Localization: localization/eventInfo Bundle-SymbolicName: loong-admin-tools-event;singleton:=true Bundle-Version: 1.0.0.qualifier Require-Bundle: org.eclipse.rap.ui,loong-integration-commons;bundle-version=“1.0.0“ Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Import-Package: org.osgi.service.event;version=“1.2.0“,org.trustie.loong.eventadmin.api 附录五 POM.XML 核高基 6-1 项目 使用手册 34 附附录录五五 pom.xml 4.0.0 com.cvicse.inforguard.utmp.modules.web.usermanager usermanager 1.0.0 /pom.xml com.cvicse.inforguard.utmp.modules.web.usermanager user-manager-api 用户管理 bundle 1.0.0 org.trustie.loong.modules.loong-webconsole loong-webconsolebundle-plugin 1.0.0 true localization, plugin.xml, resources 附录五 POM.XML 核高基 6-1 项目 使用手册 35 org.codehaus.mojo build-helper-maven-plugin 1.1 add-source generate-sources add-source src org.apache.felix maven-bundle-plugin 2.0.0 true $pom.artifactId com.cvicse.inforguard.utmp.example.hello org.trustie.loong.modules.loong-dservice loong-dservice-plugin 1.0.0 附录五 POM.XML 核高基 6-1 项目 使用手册 36 dservice-bundle org.trustie.loong.webconsole.modules loong-integration-commons 1.0.0-SNAPSHOT org.trustie.loong.modules loong-eventadmin 1.0.1 附件六 OSGI命令说明 核高基 6-1 项目 使用手册 37 附附件件六六 OSGi 命命令令说说明明 ss 命令列出所有 bundle,效果如下: 在 OSGi 控制命令台中利用 install 命令安装 exampleClient Bundle 应用,用 ss 命令查看安装后 的 Bundle 应用信息及其状态。效果如下: 在 OSGi 控制命令台中利用 start 命令安装 exampleClient Bundle 应用,用户可输入姓名,利用 姓名查询服务来判断所输入姓名是否有效,用 ss 命令查看启动后的 Bundle 应用信息及其状态。效 果如下: 附件六 OSGI命令说明 核高基 6-1 项目 使用手册 38 用户在在 OSGi 控制命令台中,可利用 stop 命令来停止指定的 Bundle 应用,和 start 使用方式 一样。 用户在在 OSGi 控制命令台中,可利用 uninstall 命令来卸载指定的 Bundle 应用,和 start 使用 方式一样。 附件七 METADATA.XML 核高基 6-1 项目 使用手册 39 附附件件七七 metadata.xml 在使用声明式服务进行开发时,我们可以在元数据文件 metadata.xml 文件中对构件自身属性, 以及构件所包含的各方面动态的进行配置,这种方式为我们在 OSGi 环境下开发一个新的服务带来 了很大的便利。 DService 元数据的根元素。一个 XML 元数据文件只有一个 DService 根节点 component DService 节点的下级节点,通过上文介绍,我们可以知道,一个构件对应于一个普通的 java 类, 以下将对构件所包含的属性进行介绍。 定义的构件为: . 对应得构件实现类如下: public class BorrowImpl implements Borrow, BorrowMoneyBuy private int m_price; public static BorrowImpl getBorrowImpl(BundleContext bc) BorrowImpl temp = new BorrowImpl(); return temp; public void setPrice(int n) this.m_price = n; 附件七 METADATA.XML 核高基 6-1 项目 使用手册 40 . component 节点信息的详细描述列表如下: 属性名是否必需默认值说明 classnameyes包括包名在内的构件的实现类完整类名。 namenoclassname 对应 的值 构件的唯一名称。定义构件实例时可以通过名称声 明与之匹配,成为该构件的实例。 immediatenofalsetrue:即时构件 false:延迟构件 publicnotrue是否将构件暴露为服务。 structurenotrue是否支持构件内省。 service component 的下级节点,声明该构件所提供的服务。默认将所有实现的接口都发布成服务。在 service 节点下 定义了下级节点 provide 来提供具体的服务,一个 service 节点下可以定义多个 provide 节点; 在 provide 节点下也可以定义多个下级节点 property,表示此方面构件提供的服务属性。以下是 service 方面的示例。 . provide 节点信息的详细描述列表如下: 属性名是否必须默认值说明 nameno该服务对象的唯一名称。 interfacesno所有已实现的 接口 需要暴露的服务接口列表,多个接口用“,”逗号 分隔,默认将构件实现类的所有接口都发布成为服 务。 strategynoservice服务对象创建策略, 取值可以是: singletonserviceinstance。 rankingno0当前服务提供者的优先等级。 property 元素详细描述如下: 附件七 METADATA.XML 核高基 6-1 项目 使用手册 41 属性名是否必须默认值属性说明 field见 1属性关联的字段,当没有声明 method 时, DService 框架会自动注入新的值。 nameyes属性名称。 method见 1属性关联的字段的 setter 方法名称,当属性被改变 时,容器调用该方法。 type见 2java.lang.String属性类型,只支持包括 String(默认)在内的简单 类型。 valueno属性默认值。 mandatorynofalse本服务属性是强制属性,当该项为 true 时属性必须 有值,该项默认是 false。 immutablenofalse本服务属性是否可变,该项默认是 false。 说明: 1.当没有声明 field 属性,但是声明了该方 method 属性时,框架调用对应的方法进行注值, 当仅声明了 field 属性,则由容器进行注入。这 2 个属性不能同时声明。 2.当声明了 field 时,不需要声明该属性,默认使用 field 对应字段的类型。当没有声明 field 时,该属性需要声明。 properties component 的下级节点,声明该构件的属性。在此节点中可以定义多个属性节点 property,定 义的这些属性可以在多个地方引用,包括 service 和 instance 等方面。在 service 方面使用属性,则 在此构件发布服务的同时这些属性也发布成服务属性;在 instance 方面使用属性,则这些属性会覆 盖 service 方面或 properties 方面所定义的属性。 properties 节点信息的详细描述列表如下: 属性名是否必须默认值说明 propagationnofalse传播属性,构件属性是否发布成为服务属性。 pidno构件成为受管服务后的唯一标识符,用来通过 Configuration Admin 重新配置构件的属性。 updatedno构件实现类中一个具体的方法名称。 property 元素详细描述如下: 属性名是否必 须 默认值属性说明 field见 1属性关联的字段,当没有声明 method 时, DService 框架会自动注入新的值。 nameyes属性名称。 method见 1属性关联的字段的 setter 方法名称,当属性被改变 时,容器调用该方法。 附件七 METADATA.XML 核高基 6-1 项目 使用手册 42 type见 2java.lang.String属性类型,只支持包括 String(默认)在内的简单 类型。 valueno属性默认值。 mandatorynofalse本服务属性是强制属性,当该项为 true 时属性必须 有值,该项默认是 false。 immutablenofalse 本服务属性是否可变,该项默认是 false。 说明: 3.当没有声明 field 属性,但是声明了该方 method 属性时,框架调用对应的方法进行注值, 当仅声明了 field 属性,则由容器进行注入。这两个属性不能同时声明。 4.当声明了 field 时,不需要声明该属性,默认使用 field 对应字段的类型。当没有声明 field 时,该属性需要声明。 reference component 的下级节点,声明该构件所引用的服务。以下是构件实现类及对应的元数据文件。 public class ServiceClient implements Runnable private Hello m_hello; private Borrow m_borrow; public void start() . public void stop() . public void bindBorrow(Borrow o) this.m_borrow = o; public void unBindBorrow() this.m_borrow = null; 元数据文件内容如下: =1)“ / 附件七 METADATA.XML 核高基 6-1 项目 使用手册 43 reference 元素用来声明引用服务,是 component 的下级元素。详细描述列表如下: 属性名是否必须默认值说明 idno当前构件服务引用元素的唯一标识。 field见 1声明构件实现类中需要引用服务的字段。该字段会 被容器注入实际服务对象。 filterno指定 LDAP 过滤器用来过滤服务提供者。 bind见 1指定服务绑定的方法,值为构建实现类中的方法名 称,当服务对象可用时被容器调用。 unbind见 1指定取消服务绑定的方法,值为构建实现类中的方 法名称,当服务对象变为不可用时被调用。 interfacesyes接口指当前引用服务的接口类型。 cardinalityyes11 01 Optional and unary. 11 Mandatory and unary (Default) . (0,1 0n Optional and multiple. 0, ) 1n Mandatory and multiple. (0, ) policynostatic引用服务的绑定规则,支持三种规则, staticdynamic dynamic-priority。 comparatorno该项可以指定一个比较器,值为位于 bundle 中的 比较器完整类名。 说明:1. 服务对象的获取定义field时使用主动获取策略,定义bind和unbind方法则使用事件驱动 策略,当二者同时定义则事件驱动策略优先。 lifecyle component 的下级节点,描述该构件状态改变时回调的方法,控制该构件的启动与停止状态。 使用 lifecycle 元素声明构件生命期控制方法,是 component 的下级节点,描述该构件状态改变 时回调的方法。lifecycle 元素详细描述如下: 属性名是否必须默认值说明 validno当构件的状态变为 valid 的时候,回调该项定义的 方法。该方法必须是在构件实现类中定义的方法。 invalidno当构件的状态变为 invalid 的时候,回调该项定义 的方法。该方法必须是在构件实现类中定义的方法。 示例: 附件七 METADATA.XML 核高基 6-1 项目 使用手册 44 advisor component 的下级节点,声明通知器,在此节点下可以定义多个切入点 pointcut 和多个通知 advice,而且在通知 advice 节点下可以定义属性节点 property,该属性可以赋值给通知,但通知要 能够接收属性的话,必须实现 ConfigurableAdvice 接口。 示例: 构件实现类 public class AopComponent public void start() System.out.println(“AopComponent has been started.“); public void stop() System.out.println(“AopComponent has been stoped“); 通知类 public class HelloAdvice implements MethodInterceptor,ConfigurableAdvice private String level = “info“; public void onEntry(Object pojo, Method method, Object args) System.out.println(level + “ Entry pojo: “ + pojo.getClass() + “ method: “ + method.toString(); public void onError(Object pojo, Method method, Throwable throwable) System.out.println(level
展开阅读全文