分享

Eclipse RCP与Spring、Hibernate零配置集成

 LibraryPKU 2014-05-20

Eclipse RCP应该是当前应用最广泛的OSGi实现了。组件式热插拔架构,让基于RCP架构的应用开发先天就在扩展性上胜人一筹。 Spring+Hibernate是最普遍的基础开发框架,其优异的性能,早就被业界认同。但是当Eclipse RCP与Spring+Hibernate相遇时,麻烦出现了!

 

OSGi的Bundle各自维护自己的ClassLoader,从而实现各个Bundle在JVM中的独立性。但正是由于独立的ClassLoader,导致了诸如跨Bundle的资源文件难以访问等问题。如何让SH框架与RCP共事,应该是很多RCP开发者头疼的事。

 

网上百度谷歌良久,大致有几种实现:

1、基于Spring DM的实现;

2、良少的SpringOSGINoDM的开源框架;

3、其他一些很有启发性的实现

 

但这些方法似乎不太适合我的需求。我期望有一套能够实现以下目标的基础架构:

1、可以在Eclipse的根目录直接配置Hibernate的连接属性;(已实现)

2、Spring、Hibernate相关的基础Bundle发布后,就不需要再根据新的组件bundle进行修改;(已实现)

3、基础组件外的新Bundle中的Model和Service可以自动组装并接受SH的管理;(已实现)

4、RCP运行时,新Bundle可以触发SessionFactory的更新,使Bundle中的数据库结构、数据库操作自动发布;(暂未实现

 

具体机构如下图:


 
 

图中:

bundle>=com.abc.def.lib.common:第三方jar包的统一管理,RCP中常用的jar包都在这边打包。当然,可以根据具体需要进行拆分;

bundle>=com.abc.def.properties:配置文件管理 bundle,其可以动态读取Eclipse RCP的根目录下properties目录中的*.properties文件。新的业务Bundle也可以往此bundle中注册自己的 properties文件。目录"%ECLIPSE_RCP_HOME%/properties/" 中的properties文件可供手动修改,如hibernate的数据库连接信息等;

bundle>=com.abc.def.lib.common:hibernate相关的jar包,依赖com.abc.def.lib.common 和 com.abc.def.properties两个bundle,MANIFEST.MF中增加: Eclipse-BuddyPolicy: dependent

bundle>=com.abc.def.lib.spring:Spring相关的jar包和相关的类,依赖com.abc.def.lib.common、 com.abc.def.properties、com.abc.def.lib.hibernate三个bundle,MANIFEST.MF中增加: Eclipse-BuddyPolicy: dependent

bundle>=com.abc.def.main:基础架构的入口bundle,这里进行RCP的初始化管理,依赖以上所有bundle。

 

RCP和SH的集成,很关键的一点就是上面红色字体标注部分,通过Eclipse的buddy机制实现bundle之间的双向访问。

 

bundle>=com.abc.def.lib.spring中,我修改覆盖了jar包中的org.springframework.util.ResourceUtils,避免Spring访问Annotation标注的Service类时找不到类的问题,具体可参见我以前的一篇文章《解决Spring的Component-scan和packagesToScan不支持Eclipse RCP问题

 

Spring和Hibernate实现了真正的零配置,所有Entity和Service都通过Spring和Hibernate的 Annotation直接定义。目前在bundle>=com.abc.def.lib.spring中,在DataSourceConfig类 中,用Annotation定义了dataSource、sessionFactory、txManager等bean,其 中,sessionFactory中,通过PackagesToScan设置了model的统一根节点:com.abc.def,只要在这个 package(包括子包)下的Annotation定义的model,都将自动纳入到SH的管理。

 

bundle>=com.abc.def.main中,通过

      ApplicationContext appContext = new AnnotationConfigApplicationContext("com.abc.def");

得到ApplicationContext。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多