osgi spring dm

转自:http://blog.csdn.net/ferry_passion/article/details/7607402

Spring-OSGi默认加载解析META-INF/spring目录下的xml文件作为spring bean配置文件,也可通过在MANIFEST.MF中增加Spring-Context来指定spring bean配置文件。

 

把一个Spring bean发布为OSGi Service,只需在spring bean的xml中这么配置就行了:

<osgi:service id=”OSGi服务ID” ref=”需要发布为OSGi服务的spring bean” interface=”服务的接口”/>

 

要在Spring bean中引用OSGi Service,只需在spring bean的xml中这么配置:

<osgi:reference ref=”需要发布为OSGi服务的spring bean” interface=”服务接口” />

 

可以看出和ds中的配置基本是一致的,不过目前尚缺少对于policy这样的属性的配置,另外如要实现bind和unbind的设置,需要在osgi:reference的元素下增加osgi:listener的节点,例如:

<osgi:reference>

<osgi:listener ref=”引用了此service的spring bean”

bind-method=”服务可用时调用的方法”

unbind-method=”服务不可用时的调用的方法”/>

</osgi:reference>

 

这里bind-method和unbind-method的方法签名和在使用DS时稍有不同,这里bind-method和unbind-method的方法签名如下所示:

public void onBind(服务接口,Dictionary)

 

在上面ds的demo里把com.ferry.client bundle稍做改动,修改部分如下

增加一个类Tiny

 

[java]  view plain copy
 
  1. public class Tiny implements CommandProvider{  
  2.       
  3.     private IAbility ability;  
  4.   
  5.     public void setAbility(IAbility ability) {  
  6.         this.ability = ability;  
  7.     }  
  8.       
  9.     public void onBind(IAbility ability,Map properties){  
  10.         this.ability = ability;  
  11.     }  
  12.       
  13.     public void onUnbind(IAbility ability,Map properties){  
  14.         this.ability = null;  
  15.     }  
  16.   
  17.     public void _countTinyDamage(CommandInterpreter ci){  
  18.         if(ability!=null){  
  19.             ci.println(ability.getName()+":"+ability.ability(4));  
  20.         }else {  
  21.             ci.println("ability is null!");  
  22.         }  
  23.     }  
  24.   
  25.     @Override  
  26.     public String getHelp() {  
  27.         return "\tcountDamage - Count the damage\n";  
  28.     }  
  29. }  


对应的spring配置文件如下

 

 

[html]  view plain copy
 
  1. <?xml version="1.0" encoding="UTF-8"?>     
  2. <beans xmlns="http://www.springframework.org/schema/beans"    
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      
  4.     xmlns:osgi="http://www.springframework.org/schema/osgi"    
  5.     xsi:schemaLocation="  
  6.         http://www.springframework.org/schema/beans                           
  7.         http://www.springframework.org/schema/beans/spring-beans.xsd     
  8.         http://www.springframework.org/schema/osgi  
  9.         http://www.springframework.org/schema/osgi/spring-osgi.xsd">     
  10.       
  11.     <bean id="tiny" class="com.ferry.hero.Tiny">  
  12.         <property name="ability" ref="ability"/>  
  13.     </bean>  
  14.       
  15.     <osgi:reference id="ability" interface="com.ferry.ability.IAbility">  
  16.         <osgi:listener ref="tiny" bind-method="onBind" unbind-method="onUnbind"></osgi:listener>  
  17.     </osgi:reference>  
  18.       
  19.     <osgi:service ref="tiny" interface="org.eclipse.osgi.framework.console.CommandProvider">  
  20.    </osgi:service>  
  21. </beans>  

 

spring-dm也支持多服务提供,有list和set两种,配置如下

<osgi:list id="引用了此service的spring bean " interface="服务接口"/>

<osgi:setid="引用了此service的spring bean " interface="服务接口“/>

 

Hero改成spring-dm 多服务提供的list方式,代码如下

 

[java]  view plain copy
 
  1. public class Hero implements CommandProvider{  
  2.       
  3.     private List<IAbility> abilityList;  
  4.       
  5.     public void setAbilityList(List<IAbility> abilityList) {  
  6.         this.abilityList = abilityList;  
  7.     }  
  8.   
  9.     public void addAbility(IAbility ability) {  
  10.         abilityList.add(ability);  
  11.         System.out.println(ability.getName());  
  12.     }  
  13.       
  14.     public void removeAbility(IAbility ability) {  
  15.         abilityList.remove(ability);  
  16.         System.out.println(ability.getName());  
  17.     }  
  18.   
  19.     public void _countDamage(CommandInterpreter ci){  
  20.         if (abilityList!=null&&abilityList.size()!=0) {  
  21.             for (IAbility ability : abilityList) {  
  22.                 ci.println(ability.getName()+":"+ability.ability(4));  
  23.             }  
  24.         }  
  25.     }  
  26.   
  27.     @Override  
  28.     public String getHelp() {  
  29.         return "\tcountDamage - Count the damage\n";  
  30.     }  
  31. }  

 

Hero对应的spring配置文件如下

 

[html]  view plain copy
 
  1. <bean id="hero" class="com.ferry.hero.Hero">     
  2.         <property name="abilityList" ref="abilitys"></property>  
  3. </bean>     
  4.        
  5. <osgi:list id="abilitys" interface="com.ferry.ability.IAbility"></osgi:list>  
  6.       
  7. <osgi:service ref="hero" interface="org.eclipse.osgi.framework.console.CommandProvider">  
  8. </osgi:service>  

 

代码运行结果大家可以通过我提供的代码自己运行,这里就不截图了

 

[html]  view plain copy
 
  1.   

用到的jar包

com.springsource.org.aopalliance-1.0.0.jar

jcl-over-slf4j-1.6.4.jar

logback-classic-1.0.0.jar

logback-core-1.0.0.jar

org.eclipse.equinox.ds_1.3.1.R37x_v20110701.jar

org.eclipse.equinox.util_1.0.300.v20110502.jar

org.eclipse.osgi.services_3.3.0.v20110513.jar

org.eclipse.osgi_3.7.2.v20120110-1415.jar

org.springframework.aop-2.5.6.SEC03.jar

org.springframework.beans-2.5.6.SEC03.jar

org.springframework.context-2.5.6.SEC03.jar

org.springframework.core-2.5.6.SEC03.jar

slf4j-api-1.6.4.jar

spring-osgi-core-1.2.1.jar

spring-osgi-extender-1.2.1.jar

spring-osgi-io-1.2.1.jar

spring-osgi-mock-1.2.1.jar

点击下载demo代码

 

猜你喜欢

转载自coffeehot.iteye.com/blog/2103861
dm