OSGi中的DS(Declarative Services)的web应用实现探索

    我正在用equinox的servletbridge在tomcat上搭建web应用,我想每个功能点做成一个bundle,主servlet作为控制器,基于请求URL而调用bundle中的bean来执行,我采用了DS来发布和使用服务。
    我先说一下我想实现的目标吧:
    一个bundle,例如是商品的查看维护,有增、删、改、查四种action,每个需要一个作为一个服务被主servlet调用,其中增、删、改都实现ActionExecute接口,有个void execute方法,查则实现ActionView接口,有Object execute方法(返回object)。
    还有其它的bundle,差不多一个表的增删改查就是一个bundle,并都实现ActionExecute接口和ActionView接口之一。所有bundle中的bean都需要实现这两个公共接口之一。
    主servlet接收到用户请求时,根据请求URL中的对应关系,调用不同的Action去执行。如用户在浏览器输入../getitem,则主servlet把请求作为参数并调用商品bundle中的ItemView的ActionView方法。

1、一个bundel如何发布多个服务呢?每个bundle至少有四个服务需要发布,网上例子中component.xml是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<component name="ItemView">
	<implementation class="com.abc.item.ItemView"/>
	<service>
		<provide interface="com.abc.core.ActionView"/>
	</service>
</component>

多个服务难道是多个service标签吗?那么implementation标签呢?试了一下,多个service标签似乎不行。
多个服务难道需要分别写多个xml配置吗?试了一下可以,我现在使用多个xml文件,一个是一个组件,包含一个服务,即增删改查各自算一个组件了,有点别扭。

2、这种接口的用法似乎与DS所要求的不同,DS的示例程序都是在一个bundle中写一个业务接口,在一个或多个bundle中写它的实现,需要这个服务的bundle中则在component.xml中把实现注入,并可以有“0..1","0..n"等不同的匹配规则。那我应该怎么发布服务呢?也把每个action都写成action接口的实现吗?但我需要根据请求动态注入,而不能在xml中写死,应该怎么处理呢?这个还没有搞定。
    另外,在主servlet中,请求URL中有字符串形式的beanid,如何根据它获得bean实例呢?DS还有lookup方式,但没找到查找过滤服务的方法,DS支持三种生命周期类型的组件,其中有一个factory类型,好象可以解决我的问题,但找不到例子搞不懂。
    但我也想出了一个办法:自己写一个简单的beanManager(类似于spring的FactoryBean),每个bundle初始化(start)时,把所有服务向这个beanmanager注册,结束时(stop)则向beanManager注销,bean id就是component.xml中的name属性,根据请求URL,直接在主servlet中实例化要执行的bean。这种方式如何?

嗯,我先这样做吧,有何结果或问题再向大家汇报。

你可能感兴趣的:(spring,Web,应用服务器,网络应用,osgi)