Eclipse RCP應(yīng)該是當(dāng)前應(yīng)用最廣泛的OSGi實(shí)現(xiàn)了。組件式熱插拔架構(gòu),讓基于RCP架構(gòu)的應(yīng)用開發(fā)先天就在擴(kuò)展性上勝人一籌。 Spring+Hibernate是最普遍的基礎(chǔ)開發(fā)框架,其優(yōu)異的性能,早就被業(yè)界認(rèn)同。但是當(dāng)Eclipse RCP與Spring+Hibernate相遇時(shí),麻煩出現(xiàn)了!
OSGi的Bundle各自維護(hù)自己的ClassLoader,從而實(shí)現(xiàn)各個(gè)Bundle在JVM中的獨(dú)立性。但正是由于獨(dú)立的ClassLoader,導(dǎo)致了諸如跨Bundle的資源文件難以訪問等問題。如何讓SH框架與RCP共事,應(yīng)該是很多RCP開發(fā)者頭疼的事。
網(wǎng)上百度谷歌良久,大致有幾種實(shí)現(xiàn): 1、基于Spring DM的實(shí)現(xiàn); 2、良少的SpringOSGINoDM的開源框架; 3、其他一些很有啟發(fā)性的實(shí)現(xiàn);
但這些方法似乎不太適合我的需求。我期望有一套能夠?qū)崿F(xiàn)以下目標(biāo)的基礎(chǔ)架構(gòu): 1、可以在Eclipse的根目錄直接配置Hibernate的連接屬性;(已實(shí)現(xiàn)) 2、Spring、Hibernate相關(guān)的基礎(chǔ)Bundle發(fā)布后,就不需要再根據(jù)新的組件bundle進(jìn)行修改;(已實(shí)現(xiàn)) 3、基礎(chǔ)組件外的新Bundle中的Model和Service可以自動(dòng)組裝并接受SH的管理;(已實(shí)現(xiàn)) 4、RCP運(yùn)行時(shí),新Bundle可以觸發(fā)SessionFactory的更新,使Bundle中的數(shù)據(jù)庫結(jié)構(gòu)、數(shù)據(jù)庫操作自動(dòng)發(fā)布;(暫未實(shí)現(xiàn))
具體機(jī)構(gòu)如下圖: 圖中: bundle>=com.abc.def.lib.common:第三方j(luò)ar包的統(tǒng)一管理,RCP中常用的jar包都在這邊打包。當(dāng)然,可以根據(jù)具體需要進(jìn)行拆分; bundle>=com.abc.def.properties:配置文件管理 bundle,其可以動(dòng)態(tài)讀取Eclipse RCP的根目錄下properties目錄中的*.properties文件。新的業(yè)務(wù)Bundle也可以往此bundle中注冊(cè)自己的 properties文件。目錄"%ECLIPSE_RCP_HOME%/properties/" 中的properties文件可供手動(dòng)修改,如hibernate的數(shù)據(jù)庫連接信息等; bundle>=com.abc.def.lib.common:hibernate相關(guān)的jar包,依賴com.abc.def.lib.common 和 com.abc.def.properties兩個(gè)bundle,MANIFEST.MF中增加: Eclipse-BuddyPolicy: dependent bundle>=com.abc.def.lib.spring:Spring相關(guān)的jar包和相關(guān)的類,依賴com.abc.def.lib.common、 com.abc.def.properties、com.abc.def.lib.hibernate三個(gè)bundle,MANIFEST.MF中增加: Eclipse-BuddyPolicy: dependent bundle>=com.abc.def.main:基礎(chǔ)架構(gòu)的入口bundle,這里進(jìn)行RCP的初始化管理,依賴以上所有bundle。
RCP和SH的集成,很關(guān)鍵的一點(diǎn)就是上面紅色字體標(biāo)注部分,通過Eclipse的buddy機(jī)制實(shí)現(xiàn)bundle之間的雙向訪問。
bundle>=com.abc.def.lib.spring中,我修改覆蓋了jar包中的org.springframework.util.ResourceUtils,避免Spring訪問Annotation標(biāo)注的Service類時(shí)找不到類的問題,具體可參見我以前的一篇文章《解決Spring的Component-scan和packagesToScan不支持Eclipse RCP問題》
Spring和Hibernate實(shí)現(xiàn)了真正的零配置,所有Entity和Service都通過Spring和Hibernate的 Annotation直接定義。目前在bundle>=com.abc.def.lib.spring中,在DataSourceConfig類 中,用Annotation定義了dataSource、sessionFactory、txManager等bean,其 中,sessionFactory中,通過PackagesToScan設(shè)置了model的統(tǒng)一根節(jié)點(diǎn):com.abc.def,只要在這個(gè) package(包括子包)下的Annotation定義的model,都將自動(dòng)納入到SH的管理。
bundle>=com.abc.def.main中,通過 ApplicationContext appContext = new AnnotationConfigApplicationContext("com.abc.def"); 得到ApplicationContext。 |
|