您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > OSGI入门和整合Spring
OSGI入门和整合Spring概述本文用于OSGI基本入门,并添加对Spring的整合,本文假设读者对Eclipse、OSGI,Spring的概念和用法有基本了解,本文仅供参考,希望起到抛砖引玉的效果,希望对大家能有帮助,能节省一点查资料的时间就善莫大焉了。若发现纰漏和疑问,望不吝指教——E-Mail:Caichaowei@gmail.com。感谢Powerpiggy,Hypaspist的指导和帮助。蔡超伟2008年4月一、创建提供服务的OSGIBundle1.创建一个Plug-in工程2.填入工程名,如图选择3.直接下一步,然后点击Finish,会显示如下图:4.选择Dependencies,添加5.点击debug的虫子图标,选择OpenDebugDialog…出现下图界面后,保证在Workspace中选择刚创建的bundle,在点击“AddRequiredBundles”,确保如下3个被选中:org.eclipse.osgiorg.eclipse.osgi.servicesorg.eclipse.equinox.ds注意昀后一个org.eclipse.equinox.ds需要手工指定,该包如果你的Eclipse下没有则需要下载安装,只有具有该jar包才能从以配置文件的方式注册服务(见后述的service.xml文件)。6.点击Debug后在控制台显示至此,一个昀基本的Bundle就完成了,但此时它还不能对外提供任何服务。7.创建一个接口IDisplay,并且创建一个实现类Display,实现其显示信息的方法setDescInfor,内容就是将传入的参数在控制台打印出来,项目结构如图:文件内容如下:/***IDisplay.java*/publicclassDisplayimplementscom.infotech.bpr.autodisplay.display.IDisplay{publicvoidsetDescInfor(StringstrInfor){System.out.println(strInfor);}}/***Display.java*/packagecom.infotech.bpr.autodisplay.display;importorg.osgi.service.component.ComponentContext;publicclassDisplayimplementscom.infotech.bpr.autodisplay.display.IDisplay{publicvoidsetDescInfor(StringstrInfor){System.out.println(显示:+strInfor);}/*activate方法会在Bundle加载完毕后自动调用,deactivate会在Bundle卸载时自动调用。*/protectedvoidactivate(ComponentContextcontext){System.out.println(显示器激活);}protectedvoiddeactivate(ComponentContextcontext){System.out.println(显示器卸载);}}/***Activator.java*/packagecom.infotech.bpr.autodisplay;importorg.osgi.framework.BundleActivator;importorg.osgi.framework.BundleContext;publicclassActivatorimplementsBundleActivator{publicvoidstart(BundleContextcontext)throwsException{System.out.println(显示组件启动);}publicvoidstop(BundleContextcontext)throwsException{System.out.println(显示组件停止);}}创建一个叫OSGI-INF的目录,下面创建一个名为service.xml的文件内容如下:?xmlversion=1.0encoding=UTF-8?componentname=DisplayServiceimplementationclass=com.infotech.bpr.autodisplay.display.Display/serviceprovideinterface=com.infotech.bpr.autodisplay.display.IDisplay//service/component上述内容的含义为声明一个名为DisplayService的组件,它对外提供接口Idisplay,实现类是Display。8.在MANIFEST.MF文件编辑器里,选择Runtime,在Exportedpackages里添加Idispaly接口所在的包在源码里添加如下一行:Service-Component:OSGI-INF/service.xml上述操作的意思为:此Bundle对外提供的服务包为com.infotech.bpr.autodisplay.display,其说明文件为OSGI-INF/service.xml9.昀后MANIFEST.MF的内容如下:Manifest-Version:1.0Bundle-ManifestVersion:2Bundle-Name:AutodisplayPlug-inBundle-SymbolicName:com.infotech.bpr.autodisplayBundle-Version:1.0.0Bundle-Activator:com.infotech.bpr.autodisplay.ActivatorBundle-Vendor:INFOTECHImport-Package:org.osgi.framework;version=1.4.0,org.osgi.service.component;version=1.0.0Export-Package:com.infotech.bpr.autodisplay.displayService-Component:OSGI-INF/service.xml简单说明:Import-Package:指需要依赖的包Export-Package:指对外暴露的接口包名Service-Component:指定提供服务的组件说明文件信息这样一个提供简单打印信息服务的Bundle就完成了!二、创建使用服务的OSGIBundle1.按第一部分所述1~6步创建一个新的Bundle工程2.在dependencies的ImportedPackages里面添加第一部分所创建的提供服务的bundle包3.生成准备调用服务的类AutoTallyTaskPro,其中定义一个类型第一部分中定义的接口IDispay的变量display,生成getter,setter,另外写一个unSetDisplay方法,用于释放display对象。昀后文件内容如下:/***Activator.java*/packagecom.infotech.brp.autotally;importorg.osgi.framework.BundleActivator;importorg.osgi.framework.BundleContext;publicclassActivatorimplementsBundleActivator{publicvoidstart(BundleContextcontext)throwsException{System.out.println(自动记账程序启动);}publicvoidstop(BundleContextcontext)throwsException{System.out.println(自动记账程序停止);}}/***AutoTallyTaskProc.java*/packagecom.infotech.brp.autotally;importjava.util.Map;importcom.infotech.bpr.autodisplay.display.IDisplay;importorg.osgi.service.component.ComponentContext;publicclassAutoTallyTaskProcimplementsIAutoTallyTaskProc{privateIDisplaydisplay;publicIDisplaygetDisplay(){returndisplay;}publicvoidsetDisplay(IDisplaydispaly){System.out.println(自动记账setDisplay);this.display=dispaly;}publicvoidunSetDisplay(IDisplaydispaly){System.out.println(自动记账unSetDisplay);if(this.display==dispaly){display=null;}}protectedvoidactivate(ComponentContextcontext){display.setDescInfor(自动记账激活,调用显示器);}publicvoiddeactivate(ComponentContextcontext){display.setDescInfor(自动记账停止调用显示器);}}4.下面配置注入IDisplay接口对象:创建一个叫OSGI-INF的目录,下面创建一个名为components.xml的文件,内容如下:?xmlversion=1.0encoding=UTF-8?componentname=Autotallyimplementationclass=com.infotech.brp.autotally.AutoTallyTaskProc/referencename=Displayerinterface=com.infotech.bpr.autodisplay.display.IDisplaybind=setDisplayunbind=unSetDisplaycardinality=1..1policy=dynamic//component在上面声明了这个组件的名称为Autotally,实现类为com.infotech.brp.autotally.AutoTallyTaskProc,还指定了其中绑定服务的类型和绑定、解绑方法。5.在MANIFEST.MF中添加:Service-Component:OSGI-INF/components.xml,昀后MANIFEST.MF的内容如下:Manifest-Version:1.0Bundle-ManifestVersion:2Bundle-Name:AutotallyPlug-inBundle-SymbolicName:com.infotech.brp.autotallyBundle-Version:1.0.0Bundle-Activator:com.infotech.brp.autotally.ActivatorBundle-Vendor:INFOTECHImport-Package:com.infotech.bpr.autodisplay.display,org.osgi.framework;version=1.4.0,org.osgi.service.component;version=1.0.0Service-Component:OSGI-INF/components.xml6.运行后能看到组件的调用过程:输入ss查看组件运行情况如下图:输入stop86,然后输入stop87,如下图:至此,一个完整的简单OSGI服务创建和调用实例已经全部展示完毕,在往下的过程中
本文标题:OSGI入门和整合Spring
链接地址:https://www.777doc.com/doc-6127118 .html