当前位置: 代码迷 >> Eclipse >> Eclipse RCP与Spring、Hibernate0配置集成
  详细解决方案

Eclipse RCP与Spring、Hibernate0配置集成

热度:80   发布时间:2016-04-23 01:19:41.0
Eclipse RCP与Spring、Hibernate零配置集成

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。

?

  相关解决方案