最困难的时期已经过去,配置好环境之后下一步就是写一个测试程序跑一下。由于我主要是为了整合Hibernate,所以测试程序就以此为前提了。
Hibernate整合本身比较简单,但如果想把框架设计得更加灵活、耦合性更低,支持以插件方式添加新的数据库表映射以及数据库操作将会比较麻烦,会涉 及到SessionFactory的生成,这些问题后续文章会陆续谈到。我们这里采用的例子是一个典型的基于角色的权限校验系统,简化后我们不再关心持久 层,只来讨论与Spring结合是如何配置的问题。
首先建一个用来注册实体类的接口,可以动态监控数据库实体类的注册与销毁。接口相当简单,代码如下:
java 代码
1. package
2.
3. @SuppressWarnings("unchecked")
4. public interface
5. // 返回需要注册的实体类的数组
6. }
这个接口单独作为一个Bundle(命名为wanged_core_persistent_entity_register),MANIFEST.MF中只需要导出该接口所在的包供其他Bundle引用即可。
现在需要实现接口了,这个接口会被用来声明一类服务,这样就可以利用OSGi的服务来达到动态添加数据库表映射的目的。
建一个包含实体类的Bundle(命名为wanged_security_entity),其实就是一个插件工程,为简单起见就叫Bundle,下同。新建一个类实现EntityRegister接口,代码如下:
java 代码
1. package
2.
3. import
4. import
5.
6. @SuppressWarnings("unchecked")
7. public class SecurityEntityRegisterImpl implements
8.
9. public
10. new
11.
12. class); // 用户角色实体类Role
13. class); // 用户信息实体类User
14.
15. return cList.toArray(new
16. }
17. }
MANIFEST.MF 中需要引入EntityRegister接口所在的包,否则会找不到该接口。另外还需要导出Role和User所在的包,以便其他Bundle调用。现在 类建好了,需要声明我们的服务了。Spring和OSGi结合可以省去DS的配置文件,这也是上一篇文章在导入所需Bundle时没有引入DS相关的 Bundle的原因。Spring可以在META-INF/spring目录下查找所有的xml文件,并自动解析生成其中定义的Bean。下面我们建一个 bean.xml的文件来声明服务,内容如下:
xml 代码
在这个xml文件中,我们声明了一个服务,用来注册权限管理中使用的实体类User和Role。
<osgi:service interface="wanged.core.persistent.entity.EntityRegister"> <bean class="wanged.security.entity.SecurityEntityRegister"> </osgi:service>
现在是万事俱备只欠东风,服务已经声明,唯独缺少使用该服务的Bundle。建一个Bundle(命名为wanged_core_persistent),新建一个测试类TestEntityRegister,代码如下:
java 代码
1. package
2.
3. import
4.
5. public class
6.
7. // 由于要注册多个这样的服务,所以参数为数组格式
8. @SuppressWarnings("unchecked")
9. public void
10. for(EntityRegister er: erArr) {
11. "EntityRegister class : "
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()方法的数组参数对应。现在已经全部搞定,所需要的就是运行一下,看是否如期输出类的信息。