国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

在Eclipse RCP中實現(xiàn)控制反轉(zhuǎn)(IoC)

2019-11-18 15:28:29
字體:
供稿:網(wǎng)友

    摘要:這篇文章描述了在Eclipse RCP中引入依靠注射機制的一個簡單方法。為了避免污染Eclipse平臺的基礎(chǔ)設(shè)施并且透明的為RCP添加IoC框架,我們使用了動態(tài)字節(jié)碼操作(使用ObjectWeb ASM類庫),java類加載agent以及Java標(biāo)注技術(shù)的組合。

    Eclipse胖客戶端平臺(Rich Client Platform,RCP)是一個功能強大的軟件基礎(chǔ)(software foundation),它基于相互聯(lián)系并協(xié)作的插件,答應(yīng)開發(fā)人員創(chuàng)建通用的應(yīng)用程序。RCP使得開發(fā)人員可以更加關(guān)注應(yīng)用程序的業(yè)務(wù)邏輯而不是花大量時間來重新發(fā)明輪子去編寫大量的應(yīng)用程序治理邏輯。

    控制翻轉(zhuǎn)(IOC)和依靠注射是一種減少程序耦合性的設(shè)計模式。它們遵循了一個簡單的原則:你不必自己創(chuàng)建對象,你只需要描述如何創(chuàng)建對象。你不必去實例化或者定位你的組件需要的服務(wù),你只需要去描述哪個組件需要哪個服務(wù),其他組件(通常是容器)來負責(zé)將它組裝好。這也就是聞名的好萊塢原則:不要打電話給我們,我們會打給你。

    這篇文章描述了在Eclipse RCP中引入依靠注射機制的一個簡單方法。為了避免污染Eclipse平臺的基礎(chǔ)設(shè)施并且透明的為RCP添加IoC框架,我們使用了動態(tài)字節(jié)碼操作(使用ObjectWeb ASM類庫),Java類加載agent以及Java標(biāo)注技術(shù)的組合。

    什么是Eclipse胖客戶端平臺?

    簡單來說,Eclipse胖客戶端平臺是一組類庫,軟件框架以及運行環(huán)境,它可以用來創(chuàng)建獨立運行并且經(jīng)常需要與網(wǎng)絡(luò)交互的應(yīng)用程序。

    盡管Eclipse是作為一個集成開發(fā)環(huán)境(IDE)框架設(shè)計的,但是,從3.0版本開始,整個項目已經(jīng)被重構(gòu)成各種獨立的組件,以便于可以使用這些組件的一個子集來構(gòu)建任意的應(yīng)用程序。這個子集構(gòu)成了RCP,它包含以下幾種組件:基本運行環(huán)境,用戶接口組件(SWT和JFace),插件以及OSGi層。圖1展示了Eclipse平臺的主要組件。

    整個Eclipse平臺是基于插件和擴展點(extensions points)這樣一個要害概念的。一個插件是可以獨立開發(fā)和發(fā)布的功能的最小單元。它一般會打包成一個jar文件并且通過增加功能來擴充Eclipse平臺(例如,增加一個編輯器,工具欄按鈕或者一個編譯器)。整個平臺就是一組互相聯(lián)系并通訊的一組插件的集合。一個擴展點是一個已經(jīng)存在的互相聯(lián)系的端點,可以被其他插件用來添加功能(功能:在Eclipse術(shù)語中叫做擴展)。擴展和擴展點通過xml配置文件定義并綁定在插件中。

    盡管插件已經(jīng)使用了關(guān)注點分離這樣一個重要的模式,但是插件之間的強相互聯(lián)系和通訊會導(dǎo)致他們之間的強依靠關(guān)系。一個典型的例子就是需要定位應(yīng)用程序需要的各種單例(Singleton)服務(wù),例如數(shù)據(jù)庫連接池,日志處理器,或者用戶偏愛(PReference)的設(shè)置信息的保存等。控制反轉(zhuǎn)和依靠注射是消除這些依靠的可行解決方案。

    控制反轉(zhuǎn)和依靠注射

    +控制反轉(zhuǎn)是一種設(shè)計模式,它主要關(guān)注如何將服務(wù)(或者應(yīng)用程序組件)的定義和服務(wù)如何定位它們依靠的服務(wù)進行分離。為了完成這種分離,一般都會依靠一個容器,或者定位框架(locator framework),維護現(xiàn)存服務(wù)的列表+提供一種方法來將組件和它們依靠的服務(wù)綁定在一起。

    +提供一種方法讓應(yīng)用程序代碼可以請求一個已經(jīng)配置好的對象(例如,一個所有依靠都已經(jīng)滿足的對象),這樣就可以保證該對象所有相關(guān)的服務(wù)都已經(jīng)可用了。

    現(xiàn)存的框架一般都使用下面三種基本技術(shù)的組合來綁定服務(wù)和組件:

    +類型一(基于接口):服務(wù)對象需要實現(xiàn)一個專門的接口,這個接口為這些服務(wù)對象提供了一個對象,服務(wù)可以通過這個對象來查詢它們的依靠。這是一些早期的容器使用的模式,例如Excalibur. +類型二(基于setter):通過JavaBean屬性的setter方法將依靠的服務(wù)賦值給服務(wù)對象。HiveMind和Spring都是通過這種方式來實現(xiàn)的。

    +類型三(基于構(gòu)造函數(shù)):依靠的服務(wù)通過構(gòu)造函數(shù)的參數(shù)提供(不通過JavaBean屬性暴露)。這是PicoContainer使用的唯一方式。HiveMind和Spring也使用了這種方式。

    我們將采用第二種方式的變種,通過帶標(biāo)注的方法來提供服務(wù)。(示例應(yīng)用的源代碼在資源中可以找到)。聲明依靠可以采用以下方式:

    @Injected public void aServicingMethod(  Service s1,   AnotherService s2) {  // save s1 and s2 into class variables  // to use them when needed}

    控制反轉(zhuǎn)容器會查找Injected標(biāo)注并且使用需要的參數(shù)來調(diào)用這個方法。在我們?yōu)镋clipse平臺引入IoC的過程中,在服務(wù)和可服務(wù)對象間建立綁定關(guān)系的代碼被封裝在一個Eclipse插件中。這個插件定義了一個擴展點(com.onjava.servicelocator.servicefactory),用來為應(yīng)用程序提供服務(wù)工廠。當(dāng)一個可服務(wù)對象需要配置時,插件會向工廠請求服務(wù)的實例。正如下面的代碼,ServiceLocator類將會完成所有的工作。(我們會跳過那些處理擴展點解析的代碼,因為這些代碼會很簡單)



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 焦作市| 察雅县| 灵川县| 逊克县| 城口县| 仙桃市| 垣曲县| 云梦县| 海南省| 邢台市| 拜泉县| 武清区| 论坛| 文山县| 绥江县| 黄骅市| 峡江县| 定结县| 营口市| 新闻| 赣榆县| 崇礼县| 贡嘎县| 连城县| 阿拉尔市| 鄂温| 乌拉特后旗| 常州市| 台安县| 乌海市| 宁阳县| 双城市| 漠河县| 饶河县| 北海市| 临朐县| 凤山县| 惠州市| 简阳市| 时尚| 绿春县|