OSGi与Spring的整合 - 拨云现日

       最困难的时期已经过去,配置好环境之后下一步就是写一个测试程序跑一下。由于我主要是为了整合Hibernate,所以测试程序就以此为前提了。
       Hibernate整合本身比较简单,但如果想把框架设计得更加灵活、耦合性更低,支持以插件方式添加新的数据库表映射以及数据库操作将会比较麻烦,会涉 及到SessionFactory的生成,这些问题后续文章会陆续谈到。我们这里采用的例子是一个典型的基于角色的权限校验系统,简化后我们不再关心持久 层,只来讨论与Spring结合是如何配置的问题。
       首先建一个用来注册实体类的接口,可以动态监控数据库实体类的注册与销毁。接口相当简单,代码如下:
java 代码
 
  1. package wanged.core.persistent.entity;    
  2.   
  3. @SuppressWarnings("unchecked")    
  4. public interface EntityRegister {    
  5.     Class[] register(); // 返回需要注册的实体类的数组    
  6. }  
这个接口单独作为一个Bundle(命名为wanged_core_persistent_entity_register),MANIFEST.MF中只需要导出该接口所在的包供其他Bundle引用即可。
       现在需要实现接口了,这个接口会被用来声明一类服务,这样就可以利用OSGi的服务来达到动态添加数据库表映射的目的。
       建一个包含实体类的Bundle(命名为wanged_security_entity),其实就是一个插件工程,为简单起见就叫Bundle,下同。新建一个类实现EntityRegister接口,代码如下:
java 代码
 
  1. package wanged.security.entity;    
  2.     
  3. import java.util.ArrayList;    
  4. import wanged.core.persistent.entity.EntityRegister;    
  5.    
  6. @SuppressWarnings("unchecked")    
  7. public class SecurityEntityRegisterImpl implements EntityRegister{    
  8.   
  9.     public Class[] register() {    
  10.         ArrayList cList = new ArrayList();    
  11.   
  12.         cList.add(Role.class); // 用户角色实体类Role    
  13.         cList.add(User.class); // 用户信息实体类User    
  14.   
  15.         return cList.toArray(new Class[cList.size()]);    
  16.     }    
  17. }    

MANIFEST.MF 中需要引入EntityRegister接口所在的包,否则会找不到该接口。另外还需要导出Role和User所在的包,以便其他Bundle调用。现在 类建好了,需要声明我们的服务了。Spring和OSGi结合可以省去DS的配置文件,这也是上一篇文章在导入所需Bundle时没有引入DS相关的 Bundle的原因。Spring可以在META-INF/spring目录下查找所有的xml文件,并自动解析生成其中定义的Bean。下面我们建一个 bean.xml的文件来声明服务,内容如下:
xml 代码
 
<osgi:service interface="wanged.core.persistent.entity.EntityRegister">                     <bean class="wanged.security.entity.SecurityEntityRegister">                   </osgi:service> 

在这个xml文件中,我们声明了一个服务,用来注册权限管理中使用的实体类User和Role。
    现在是万事俱备只欠东风,服务已经声明,唯独缺少使用该服务的Bundle。建一个Bundle(命名为wanged_core_persistent),新建一个测试类TestEntityRegister,代码如下:
java 代码
 
  1. package test.core.persistent;  
  2.   
  3. import wanged.core.persistent.entity.EntityRegister;  
  4.   
  5. public class TestEntityRegister{  
  6.               
  7.     // 由于要注册多个这样的服务,所以参数为数组格式  
  8.     @SuppressWarnings("unchecked")  
  9.     public void setEntityRegister(EntityRegister[] erArr) {  
  10.         for(EntityRegister er: erArr) {  
  11.             System.out.println("EntityRegister class : " + er.getName());  
  12.             for(Class c : er.register()) {  
  13.                 System.out.println(c.getName());  
  14.             }  
  15.         }  
  16.     }  
  17. }  

MANIFEST.MF中引入 wanged.core.persistent.entity。在META-INF中添加spring/bean.xml,并定义该测试类:
xml 代码
 
  1. <osgi:reference id="entityRegister"            
  2.     interface="wanged.core.persistent.entity.EntityRegister" cardinality="1..n" />            
  3.   
  4. <bean id="testEntityRegister" class="test.core.persistent.TestEntityRegister">            
  5.   <property name="entityRegister" ref="entityRegister" />          
  6. </bean>   

   注意上面的cardinality设置正是和setEntityRegister()方法的数组参数对应。现在已经全部搞定,所需要的就是运行一下,看是否如期输出类的信息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值