Struts1与spring在osgi之上的集成
From Tuscany中文社区
[编辑] spring-osgi的工作原理
springframework提供的osgi方案叫做dynamic module,这个方案提供了一个基于osgi内核、osgi bundle模式的ioc模式的应用。 本人认为,spring的强大的IoC特性通过dynamic module(以下称spring-osgi)在osgi之上得到了很好的应用。 spring-osgi的构成分为两个关键部分:
- osgi bundle的manifest.mf内容,增加Spring-Context:标记,其后的值指向一个spring的xml文件;
- spring的xml文件中增加了支持osgi的扩展标记;
- 通过扩展标记将bean发布为osgi服务
- 通过扩展标记引用来自不同的bundle的服务
图中:bundle将软件分割为若干个部分,每个部分将其最有价值的部分发布为OSGi服务。同时引用其它bundle提供的OSGi服务,没有spring-osgi的时候,这个过程只能由程序自行实现,但是现在spring-osgi的IoC为开发者实现了。
springframework提供的一个重要的bundle:org.springframework.osgi.bundle.extender(版本:1.0.0.rc1)。当然,该bundle的启动需要预先安装它所依赖的其它bundle。该bundle启动时,会“扫描”正在运行的各个bundle,并试图发现manifest.mf里面的Spring-Context:。然后加载其指向的xml资源。
spring-osgi依赖的其它bundle:
- org.eclipse.osgi,eclipse3.3自带版本:3.3.1.R33x_v20070828
- org.springframework.osgi.bundle.io,当前版本:1.0.0.rc1
- org.springframework.osgi.bundle.core,当前版本:1.0.0.rc1
- org.apache.commons.logging,eclipse3.3自带版本:1.0.4.v200706111724
- aopalliance.osgi,当前版本:1.0.0.SNAPSHOT
- org.springframework.bundle.spring.aop_2.5.0
- org.springframework.bundle.spring.beans_2.5.0
- org.springframework.bundle.spring.core_2.5.0
- org.springframework.bundle.spring.context_2.5.0
[编辑] spring-osgi的IoC特点
与Spring原来的IoC相比,OSGi的服务的加载被分割到每个bundle中,并且其加载顺序并不由spring决定,所以spring-osgi通过listener克服了这种无序加载所带来的困难,也就是说,当开发者声明引用一个服务的时候,spring-osgi实际上仅仅是为引用方增加了一个listener,当被引用服务“出现”的时候,它才被真正引用近来。
这个listener会“检查”每个服务,并用指定的java接口类型进行匹配,匹配成功的,就是目标/被引用服务。
[编辑] spring-osgi扩展标记的使用
- 首先声明扩展标记的namespace:http://www.springframework.org/schema/osgi
- 按照传统spring bean的声明方式,开发bean
- 通过<osgi:service/>将任何bean声明为osgi服务;
- 同时,必须在manifest.mf中,将该bean的接口以及实现类声明为Export-Package,否则,将会在运行的时候产生奇怪的错误;
- 以传统的方式引用一个服务,如<bean><property/></bean>这种形势;
- 用<osgi:reference/>声明一个对来自任何bundle的服务的引用;该项声明与5所指的引用者通过name/id来匹配。


