我们上次开发了包含本地服务和远程服务两个插件的pulg-in项目,并且学习了如何注册和获取service,如何绑定http服务,如何绑定servlet服务。
接下来我们依旧使用osgi技术,将项目改为使用spring注入技术的项目。
说到这里不得不介绍一下spring-dm:
spring-dm指的是 spring dynamic modules。spring-dm 的主要目的是能够方便地将 spring 框架和osgi框架结合在一起,使得使用spring的应用程序可以方便简单地部署在osgi环境中,利用osgi框架提供的服务,将应用变得 更加模块化。
所以我们接下来要做的就是spring-dm与osgi的结合。
可以从 spring 的网站上下载最新的 spring-dm 包。目前最新的版本为 1.2.0 rc1,下载地址在:
http://download.csdn.net/detail/u013517797/9463540
下载了这个spring-dm 包后,我们把压缩包中的dist和lib目录解压到硬盘上的某个目录,比如解压到d盘根目录下的 spring-dm 目录中。那么我们会在d:\spring-dm\dist目录下看到如下图所示的内容。
在d:\spring-dm\lib中看到如下图所示的内容。
然后我们要在我们的项目中引入需要的spring插件,我们点击import,然后选择 import plugin-ins and fragments:
然后做一下设置
我们要设置 plug-in location,先设置为 d:\spring-dm\dist,导入 sprimg-dm 的包:
点击 next 后,出现了让我们选择导入的plugin界面
我们可以导入 core、extender、io 三个 bundle。
完成后可以在eclipse的工作区看到引入的三个插件:
我们直接在 run configurations 中选择这三个 bundle,并执行,会发现三个 bundle 都是installed状态,如果我们启动bundle,会报错,原因是我们没有加入这三个bundle所依赖的bundle。而这些bundle,也就在d:\spring-dm\lib目录下。我们用和前面一样的方式来导入lib中所需要的bundle。
要 导 入 的 bundle 是
com.springsource.org.aopalliance
org.springframework.aop
org.springframework.beans
org.springframework.context
org.springframework.context.support
org.springframework.core
导入完之后我们在eclipse的工作区看到引入的插件:
我们再次配置一下run configurations:
(单纯的,我们自己的加了更多需要的插件)
然后我们将此环境运行起来,然后出现如下画面就是我们的环境配置成功:
然后我们输入ss指令,发现我们的环境中的spring插件全部active:
我们的环境配置完成之后,接下来我们开始改造我们的翻译助手项目。
首先改造我们的本地查询服务,我们在localtranslateasslt的manifest.mf导入我们需要的插件依赖:
javax.servlet;
javax.servlet.http;
org.osgi.service.http;
然后将本工程下的activator类删除(我们接下来将不通过activator来注入service和获取service了,我们通过spring的注入来注册和获取相应的服务),并在manifest.mf中删除bundle-activator:选项。
然后我们在工程下创建一个名为“osgi-inf”的文件夹,然后创建一个名为“component.xml”的xml配置文件:
然后在manifest.mf中添加service-component: osgi-inf/component.xml这句话(如果报"header must be terminated by a line break"的错,在上面那个配置末尾加一个回车就好了)。
这个文件就是配置我们该插件项目注册的service,其中的内容为:
可以看到,我们注册了一个名为"translateservice"的service,这个service的实例化类为"com.zyg.osgi.localtranslateasslt.impls.translateservicelocalimpl"。
同理,我们在远程服务插件中做相同的操作,先加入相应的依赖(javax.servlet;javax.servlet.http;org.osgi.service.http;),然后删除activator类,然后在manifest.mf中删除bundle-activator:选项,并创建osgi-inf的文件夹与component.xml配置文件,然后在manifest.mf中添加service-component: osgi-inf/component.xml这句话。接着在配置文件中写入如下配置:
最后我们修改我们的web入口插件translateclient,先加入相应的依赖(javax.servlet;javax.servlet.http;org.osgi.service.http;),然后删除其activator类,然后在manifest.mf中删除bundle-activator:选项,并创建osgi-inf的文件夹与component.xml配置文件,然后在manifest.mf中添加service-component: osgi-inf/component.xml这句话。接着在component.xml写入以下配置:
可以看到我们配置了servlet和servlet的实现,然后里面的参数是servlet依赖的类,分别是translateservice和httpservice。
然后我们修改一下translateserviceservlet,让其能够通过配置文件注入translateservice和httpservice:
我们配置一下run configuration,在之前的基础上,将我们的项目的四个部分全部引入进去(localtranslateasslt、remotetranslateasslt、translateasslt、translateclient)
如果出现java.lang.classnotfoundexception:等错误,应在target platform中加入等工程中需要的依赖插件。
我们现在运行一下我们的项目:
说明我们的项目运行成功,那么使用ss指令发现我们的插件都是运行正常 的,那么我们先停掉我们的远程服务
测试一下本地服务:
可以看到本地服务查询是正常的,远程服务查询是停掉的。
然后停掉我们的本地服务,启动远程服务:
测试一下远程服务:
可以看到远程服务查询是正常的,本地服务查询是停掉的。
至此,我们的osgi和spring-dm整合成功。
转载请注明出处:http://blog.csdn.net/acmman/article/details/50935373