欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種組件構(gòu)建方法和裝置的制作方法

文檔序號:6575469閱讀:254來源:國知局
專利名稱:一種組件構(gòu)建方法和裝置的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及軟件技術(shù)領(lǐng)域,特別是涉及-種支持循環(huán)依賴的組件構(gòu)建方法 和裝置。
背景技術(shù)
面向組件的開發(fā)是面向服務(wù)開發(fā)的基礎(chǔ),隨著SOA(面向服務(wù)的體系結(jié)構(gòu)) 的推進(jìn),系統(tǒng)的組件化過程要求越來越迫切?;谶@種需求,大規(guī)模軟件系統(tǒng) 越來越需要一個(gè)支持組件化思想的開發(fā)、運(yùn)行和管理框架,而組件之間的關(guān)系 管理是這一框架的基本功能。組件之間關(guān)系的建立,目前主流的技術(shù)都是采用 依賴注射(DI: Dependency Injection)的方式實(shí)現(xiàn)。按照依賴注射的作用點(diǎn),其主 要分為創(chuàng)建注射和屬性注射。創(chuàng)建注射指在創(chuàng)建組件時(shí)建立組件之間的關(guān)系, 而屬性注射指在組件創(chuàng)建完成后通過組件的屬性建立組件之間的關(guān)系。無論是 創(chuàng)建注射還是屬性注射,在一個(gè)復(fù)雜的組件關(guān)系中不可避免的可能存在依賴環(huán) 路。
然而,現(xiàn)有的組件系統(tǒng)尚不能安全可靠的支持組件之間的循環(huán)依賴關(guān)系, 存在不能成功地構(gòu)建具有循環(huán)依賴關(guān)系的組件的問題。這樣的系統(tǒng)大大約束了 組件系統(tǒng)設(shè)計(jì)開發(fā)的模式,限制了具有復(fù)雜組件關(guān)系的軟件系統(tǒng)的設(shè)計(jì)開發(fā)靈 活度,從而大大影響了軟件系統(tǒng)的設(shè)計(jì)開發(fā)效率。

發(fā)明內(nèi)容
本發(fā)明提供一種組件構(gòu)建方法和裝置,能夠正確的構(gòu)建出循環(huán)依賴環(huán)路中 的組件。
為了達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的
一種組件構(gòu)建方法,該方法包括A、 確定循環(huán)依賴環(huán)路中作為切割點(diǎn)的第一組件;
B、 為作為切割點(diǎn)的第一組件創(chuàng)建對應(yīng)的臨時(shí)組件;
C、 利用第一組件對應(yīng)的臨時(shí)組件,構(gòu)建循環(huán)依賴環(huán)路中依賴于第一組件的 第二組件;
D、 從第二組件開始,按照被依賴關(guān)系依次構(gòu)建循環(huán)依賴環(huán)路中的其他組件, 直至第一組件構(gòu)建完成;
E、 利用第一組件更新第二組件的構(gòu)建信息。 所述步驟A包括
在一個(gè)構(gòu)建線程中,在每一個(gè)組件被請求構(gòu)建時(shí),判斷該組件是否是第一 次被請求構(gòu)建,如果是第一次被請求構(gòu)建,則繼續(xù)判斷該組件是否存在依賴的
組件,如果存在,則請求構(gòu)建該依賴的組件,返回步驟A;如果不是第一次被請
求構(gòu)建,則確定存在循環(huán)依賴環(huán)路,并將該組件確定為循環(huán)依賴環(huán)路中作為切 割點(diǎn)的第一組件。
所述歩驟A包括將循環(huán)依賴環(huán)路中的任意一個(gè)組件確定為所述第一組件。 當(dāng)所述依賴為創(chuàng)建依賴時(shí),所述步驟E包括遍歷第二組件的所有字段,使
用第一組件替換遍歷到的每一個(gè)所述臨時(shí)組件;
當(dāng)所述依賴為屬性依賴時(shí),所述步驟E包括以第一組件作為參數(shù),調(diào)用第
二組件的屬性設(shè)置方法,把第二組件中的依賴屬性的值從所述臨時(shí)組件替換為
第一組件。
該方法進(jìn)一步包括根據(jù)依賴關(guān)系的特點(diǎn)所需要的補(bǔ)償邏輯,預(yù)先設(shè)置針 對創(chuàng)建依賴的第一類型回調(diào)函數(shù)和針對屬性依賴的第二類型回調(diào)函數(shù);
在歩驟B中,進(jìn)一步包括在第一組件對應(yīng)的臨時(shí)組件中設(shè)置對應(yīng)當(dāng)前依賴 關(guān)系的回調(diào)函數(shù)注冊接口;
在歩驟C中進(jìn)一步包括所述第二組件利用所述臨時(shí)組件中的回調(diào)函數(shù)注冊
接口,注冊第一類型回調(diào)函數(shù)或第二類型回調(diào)函數(shù);
通過調(diào)用第二組件注冊的第一類型回調(diào)函數(shù)或第二類型回調(diào)函數(shù)執(zhí)行所述
歩驟E。
7該方法進(jìn)一步包括每一個(gè)組件在構(gòu)建時(shí)獲取了其依賴的組件,判斷獲取 到的組件是否是臨時(shí)組件,如果是臨時(shí)組件,則將所獲取的臨時(shí)組件的信息、 該構(gòu)建的組件的信息以及對應(yīng)的補(bǔ)償方式信息登記到預(yù)先設(shè)置的補(bǔ)償組件列表
中;
第二組件利用補(bǔ)償組件列表中與其對應(yīng)的臨時(shí)組件信息和補(bǔ)償方式信息,
執(zhí)行所述步驟E。
所述步驟B進(jìn)一步包括在臨時(shí)組件中創(chuàng)建補(bǔ)償信息表;
所述步驟C進(jìn)一步包括將依賴于該臨時(shí)組件的第二組件以及其與臨時(shí)組件 的依賴關(guān)系登記在臨時(shí)組件的補(bǔ)償信息表中;
對登記在臨時(shí)組件的補(bǔ)償信息表中的第二組件,根據(jù)登記的依賴關(guān)系是創(chuàng)
建依賴還是屬性依賴執(zhí)行所述步驟E。
當(dāng)所述第一組件以接口形式對外提供服務(wù)時(shí),所述歩驟B包括按照動(dòng)態(tài)代 理方法,產(chǎn)生繼承所述第一組件所有暴露的接口的類,該類不包括依賴信息, 將產(chǎn)生的該類作為所述第 一組件對應(yīng)的臨時(shí)組件,
當(dāng)所述第一組件以類形式對外提供服務(wù)時(shí),所述步驟B包括按照二進(jìn)制代 碼修改方法,產(chǎn)生繼承所述第一組件的類,該類不包括依賴信息,將產(chǎn)生的該 類作為所述第一組件對應(yīng)的臨時(shí)組件。
在一個(gè)構(gòu)建線程中執(zhí)行所述步驟A至步驟E;
該方法進(jìn)一步包括為當(dāng)前的構(gòu)建線程加一排他鎖,在當(dāng)前構(gòu)建線程結(jié)束 后,解除該排他鎖。
一種組件構(gòu)建裝置,該裝置包括
切割點(diǎn)確定模塊,用于確定循環(huán)依賴環(huán)路中作為切割點(diǎn)的第一組件; 臨時(shí)組件創(chuàng)建模塊,用于為所述切割點(diǎn)確定模塊確定的第一組件創(chuàng)建對應(yīng) 的臨時(shí)組件';
構(gòu)建執(zhí)行模塊,用于利用所述臨時(shí)組件創(chuàng)建模塊創(chuàng)建的臨時(shí)組件,構(gòu)建循 環(huán)依賴環(huán)路中依賴于第一組件的第二組件,并從第二組件開始,按照被依賴關(guān)
系依次構(gòu)建循環(huán)依賴環(huán)路中的其他組件,直至第一組件構(gòu)建完成;回調(diào)補(bǔ)償模塊,用于利用所述構(gòu)建執(zhí)行模塊構(gòu)建的第一組件,更新第二組 件的構(gòu)建信息。
所述切割點(diǎn)確定模塊,在一個(gè)構(gòu)建線程中,在每一個(gè)組件被請求構(gòu)建時(shí), 判斷該組件是否是第一次被請求構(gòu)建,如果是,則判斷該組件是否存在依賴的 組件,如果存在,則請求構(gòu)建該依賴的組件;如果不是,則確定存在循環(huán)依賴 環(huán)路,并將該組件確定為循環(huán)依賴環(huán)路中作為切割點(diǎn)的第一組件。
所述回調(diào)補(bǔ)償模塊,在當(dāng)前創(chuàng)建線程中第二組件對第一組件存在創(chuàng)建依賴 時(shí),遍歷第二組件的所有字段,使用第一組件替換遍歷到的每一個(gè)所述臨時(shí)組 件;在當(dāng)前創(chuàng)建線程中第二組件對第一組件存在屬性依賴時(shí),以第一組件作為 參數(shù),調(diào)用第二組件的屬性設(shè)置方法,把第二組件中的依賴屬性的值從所述臨 時(shí)組件替換為第一組件。
所述構(gòu)建執(zhí)行模塊在創(chuàng)建臨時(shí)組件時(shí),如果所述第一組件以接口形式對外 提供服務(wù),則按照動(dòng)態(tài)代理方法,產(chǎn)生繼承所述第一組件所有暴露的接口的類, 該類不包括依賴信息,將產(chǎn)生的該類作為所述第一組件對應(yīng)的臨時(shí)組件;如果 所述第一組件以類形式對外提供服務(wù),則按照二進(jìn)制代碼修改方法,產(chǎn)生繼承 所述第一組件的類,該類不包括依賴信息,將產(chǎn)生的該類作為所述第一組件對 應(yīng)的臨時(shí)組件。
根據(jù)本發(fā)明的方法和裝置,在判斷出存在循環(huán)依賴環(huán)路時(shí),通過創(chuàng)建與正 式組件對應(yīng)的臨時(shí)組件,使正式組件所直接或間接依賴的組件臨時(shí)依賴于臨時(shí) 組件,從而從邏輯上消除循環(huán)依賴環(huán)路,實(shí)現(xiàn)循環(huán)依賴切割;并且在構(gòu)建正式 組件的過程中登記循環(huán)依賴補(bǔ)償信息,然后在正式組件除循環(huán)依賴之外的部分 構(gòu)建完畢之后,再根據(jù)登記的循環(huán)依賴補(bǔ)償信息,對該依賴于該正式組件的組 件補(bǔ)充循環(huán)依賴切除時(shí)丟失的信息,使暫時(shí)引用于臨時(shí)組件的組件引用正式組 件,實(shí)現(xiàn)循環(huán)依賴補(bǔ)償。由此,通過在通常的組件構(gòu)建過程中加入循環(huán)依賴切 割和循環(huán)依賴補(bǔ)償處理,本發(fā)明的組件構(gòu)建方法和裝置,能夠提供支持組件之 間的循環(huán)依賴關(guān)系,可以提高軟件系統(tǒng)的設(shè)計(jì)開發(fā)效率。


圖1是本發(fā)明實(shí)施例中的組件構(gòu)建方法的流程圖2是一種循環(huán)依賴環(huán)路的示意圖3是本發(fā)明裝置的基本結(jié)構(gòu)示意圖。
具體實(shí)施例方式
為了使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面結(jié)合附圖和具體實(shí) 施例對本發(fā)明進(jìn)行詳細(xì)描述。
本發(fā)明提出了一種組件構(gòu)建方法,該方法包括確定循環(huán)依賴環(huán)路中作為 切割點(diǎn)的第一組件;為作為切割點(diǎn)的第一組件創(chuàng)建對應(yīng)的臨時(shí)組件;利用第一 組件對應(yīng)的臨時(shí)組件,構(gòu)建循環(huán)依賴環(huán)路中依賴于第一組件的第二組件;從第 二組件開始,按照被依賴關(guān)系依次構(gòu)建循環(huán)依賴環(huán)路中的其他組件,直至第一 組件構(gòu)建完成;利用第一組件更新第二組件的構(gòu)建信息。
可見,在本發(fā)明中,為作為切割點(diǎn)的第一組件創(chuàng)建臨時(shí)組件,這樣,依賴 于該第一組件的第二組件在創(chuàng)建時(shí)則可以臨時(shí)依賴并利用該臨時(shí)組件,而由于 該臨時(shí)組件不依賴任何其他組件,因此,相當(dāng)于切斷了循環(huán)依賴環(huán)路,另外, 由于是從依賴于切割點(diǎn)的組件開始構(gòu)建,直至切割點(diǎn),因此,能夠保證循環(huán)依 賴環(huán)路中的每一個(gè)組件都能被構(gòu)建,最后還會(huì)根據(jù)正式的第一組件更新利用臨 時(shí)組件構(gòu)建的第二組件,也就是進(jìn)行了循環(huán)切割補(bǔ)償處理,因此,能夠保證構(gòu) 建出的循環(huán)依賴環(huán)路中的所有組件完整正確。
在本發(fā)明中,確定循環(huán)依賴環(huán)路中的切割點(diǎn)的方式可以有多種比如,方 式一、根據(jù)一個(gè)組件被請求構(gòu)建的次數(shù)確定,如果一個(gè)組件在一個(gè)構(gòu)建線程中 不是第一次被請求構(gòu)建,則說明出現(xiàn)了循環(huán)依賴環(huán)路,則可以將非第一次被請 求構(gòu)建的組件作為切割點(diǎn);方式二、在確定出現(xiàn)了循環(huán)依賴環(huán)路之后,可以將 該循環(huán)依賴環(huán)路中的任意一個(gè)組件作為切割點(diǎn)。
下面,參照圖l來說明本發(fā)明的組件構(gòu)建方法的流程圖。在圖l所示流程中, 以上述方式一來確定循環(huán)依賴環(huán)路的切割點(diǎn)。
10本發(fā)明的組件構(gòu)建方法在一個(gè)組件被請求構(gòu)建之后,開始本流程。 在步驟100判斷該被請求的組件是否已經(jīng)構(gòu)建好,如果已經(jīng)構(gòu)建好,則直接 向請求方返回該組件,否則進(jìn)入步驟101。
步驟IOI,判斷當(dāng)前被請求構(gòu)建的組件是否第一次被請求構(gòu)建,如果是,則
執(zhí)行步驟102,否則,執(zhí)行步驟104。
在本第一實(shí)施方式中,通過為當(dāng)前組件設(shè)置請求構(gòu)建計(jì)數(shù)器來進(jìn)行判斷, 當(dāng)被請求構(gòu)建的組件的請求構(gòu)建計(jì)數(shù)器的計(jì)數(shù)值為l時(shí),可以判斷出被請求構(gòu)建 的組件是第一次被請求構(gòu)建;而當(dāng)被請求構(gòu)建的組件的請求構(gòu)建計(jì)數(shù)器的計(jì)數(shù)
值大于1時(shí),可以判斷出被請求構(gòu)建的組件不是第一次被請求構(gòu)建。這里,判斷 是否是第一次被請求構(gòu)建,是為了判斷是否存在循環(huán)依賴環(huán)路,如果在一個(gè)構(gòu) 建線程中不是第一次被請求構(gòu)建,則說明一定存在循環(huán)依賴環(huán)路,需要進(jìn)行步
驟104及其后續(xù)步驟的相應(yīng)處理,如果是第一次,則還需進(jìn)行步驟102中的處理 進(jìn)一步區(qū)分是否存在循環(huán)依賴環(huán)路。
步驟102:判斷當(dāng)前組件是否存在依賴的組件,如果不存在,則執(zhí)行步驟103, 如果存在,則請求構(gòu)建當(dāng)前組件依賴的組件,返冋步驟IOO。
步驟103:確定當(dāng)前線程中沒有循環(huán)依賴環(huán)路,直接構(gòu)建該當(dāng)前組件,結(jié)束
當(dāng)前流程。
如果步驟101中判斷的結(jié)果為不是第一次被請求構(gòu)建,則可以確定當(dāng)前存在 循環(huán)依賴環(huán)路,并且,可以將當(dāng)前被請求構(gòu)建的組件作為切割點(diǎn),進(jìn)行后續(xù)切 割循環(huán)依賴環(huán)路的處理,進(jìn)入步驟104。
步驟104:將當(dāng)前組件作為切割點(diǎn),創(chuàng)建對應(yīng)該當(dāng)前組件的臨時(shí)組件,返回 給依賴于該切割點(diǎn)的組件。
在該步驟中,構(gòu)建與正式組件對應(yīng)的臨時(shí)組件,并向請求方返回該臨時(shí)組件。
在本實(shí)施方式中,臨時(shí)組件具有以下特點(diǎn)1.臨時(shí)組件與正式組件從型上 兼容,這樣對外部系統(tǒng)或者其他組件來說該臨時(shí)組件的外觀和正式組件是沒有 區(qū)別的;2.臨時(shí)組件的創(chuàng)建不依賴別的組件,這樣可以在構(gòu)建臨時(shí)組件過程中避免產(chǎn)生循環(huán)依賴問題,可以切除循環(huán)依賴的環(huán)路,提高創(chuàng)建效率;3.由于臨 時(shí)組件不是完備的正式組件,因此不能作為服務(wù)返回給其他依賴組件,保證了 組件對外服務(wù)邏輯的正確性。這樣,通過創(chuàng)建臨時(shí)組件,使原本依賴于正式組 件的組件臨時(shí)依賴于臨時(shí)組件,從而起到切割循環(huán)依賴的作用。
在本步驟104中,創(chuàng)建臨時(shí)組件的方法包括如果當(dāng)前組件以接口形式
對外提供服務(wù)時(shí),那么,則按照J(rèn)AVA中的動(dòng)態(tài)代理方法,產(chǎn)生繼承當(dāng)前組
件所有暴露的接口的類,該類不包括依賴信息,將產(chǎn)生的該類作為當(dāng)前組件
對應(yīng)的臨時(shí)組件;
如果當(dāng)前組件以類形式對外提供服務(wù)時(shí),那么,則按照J(rèn)AVA中的二進(jìn)制 代碼修改方法,產(chǎn)生繼承當(dāng)前組件的類,該類不包括依賴信息,將產(chǎn)生的該 類作為當(dāng)前組件對應(yīng)的臨時(shí)組件。
步驟105:首先利用創(chuàng)建的臨時(shí)組件,創(chuàng)建依賴于上述切割點(diǎn)的組件。
步驟106:從依賴于切割點(diǎn)的組件開始,按照被依賴關(guān)系依次構(gòu)建循環(huán)依 賴環(huán)路中的其他組件,直至作為切割點(diǎn)的組件構(gòu)建完成。
步驟107:對依賴于切割點(diǎn)的組件進(jìn)行循環(huán)依賴補(bǔ)償。
需要說明的是,在實(shí)際的業(yè)務(wù)實(shí)現(xiàn)中,依賴關(guān)系可以是創(chuàng)建依賴,也就是 說, 一個(gè)組件在創(chuàng)建時(shí)依賴于另一個(gè)組件;依賴關(guān)系也可以是屬性依賴,也就 是說, 一個(gè)組件的一個(gè)特定的屬性值依賴于其他組件。
這樣,當(dāng)所述依賴為創(chuàng)建依賴時(shí),本步驟的具體過程包括遍歷依賴于
切割點(diǎn)的組件的所有字段,使用作為切割點(diǎn)的組件替換遍歷到的每一個(gè)臨時(shí)
組件;當(dāng)所述依賴為屬性依賴時(shí),本步驟的具體過程包括以作為切割點(diǎn)的
組件作為參數(shù),調(diào)用依賴于切割點(diǎn)的組件的屬性設(shè)置方法,把依賴于切割點(diǎn)的 組件中的依賴屬性的值從臨時(shí)組件替換為作為切割點(diǎn)的正式組件。
對于循環(huán)依賴補(bǔ)償處理,具體的軟件實(shí)現(xiàn)方法,至少可以包括如下三種
方法
方法l、預(yù)先設(shè)置回調(diào)函數(shù),在組件創(chuàng)建過程中在創(chuàng)建的臨時(shí)組件中設(shè)置 回調(diào)函數(shù)注冊接口,由依賴于切割點(diǎn)的組件通過該接口注冊回調(diào)函數(shù),后續(xù)數(shù)實(shí)現(xiàn)補(bǔ)償。
在該方法1中,詳細(xì)的實(shí)現(xiàn)過程包括
首先、預(yù)先根據(jù)組件和依賴關(guān)系的特點(diǎn)(創(chuàng)建依賴還是循環(huán)依賴)所需 要的補(bǔ)償邏輯設(shè)置回調(diào)函數(shù),這里的回調(diào)函數(shù)的預(yù)置邏輯有兩種針對創(chuàng)建 依賴的第一類型回調(diào)函數(shù)和針對屬性依賴的第二類型回調(diào)函數(shù)。其中,第一 類型回調(diào)函數(shù)預(yù)置邏輯為遍歷組件字段中的,把組件字段中的臨時(shí)組件替換 為正式的組件,第二類型回調(diào)函數(shù)預(yù)置邏輯為以正式組件作為參數(shù),調(diào)用組 件的屬性設(shè)置方法,把屬性替換為正式組件。在此,第一類型回調(diào)函數(shù)和第二 類型回調(diào)函數(shù)既可以是以當(dāng)前正在構(gòu)建的組件和依賴關(guān)系為參數(shù)的共享的函 數(shù),也可以是分別設(shè)置的功能不同的函數(shù)??梢允褂萌魏文軌?qū)⒀h(huán)依賴關(guān)系 補(bǔ)充完備的函數(shù)。
這樣,在上述步驟104中,在創(chuàng)建的臨時(shí)組件中設(shè)置對應(yīng)當(dāng)前依賴關(guān)系的 回調(diào)函數(shù)注冊接口,維護(hù)和管理用于循環(huán)依賴補(bǔ)償?shù)幕卣{(diào)函數(shù)列表;在上述步
驟105中,在依賴于切割點(diǎn)的組件構(gòu)建時(shí),由該組件利用所述臨時(shí)組件中的 回調(diào)函數(shù)注冊接口,注冊第一類型回調(diào)函數(shù)或者第二類型回調(diào)函數(shù);這樣,在 更新依賴于切割點(diǎn)的組件的構(gòu)建信息,即對依賴于切割點(diǎn)的組件進(jìn)行循環(huán)依 賴補(bǔ)償時(shí),依次調(diào)用回調(diào)函數(shù)列表中所注冊的回調(diào)函數(shù),如果是創(chuàng)建依賴, 則由依賴于切割點(diǎn)的組件調(diào)用所注冊的第一類型回調(diào)函數(shù),從而實(shí)現(xiàn)上述步 驟107,如果是屬性依賴,則由依賴于切割點(diǎn)的組件調(diào)用第二類型回調(diào)函數(shù), 從而實(shí)現(xiàn)上述步驟107。
方法2、預(yù)先設(shè)置用于登記補(bǔ)償組件的補(bǔ)償組件列表,補(bǔ)償組件列表中包 括一一對應(yīng)的臨時(shí)組件、待補(bǔ)償組件和補(bǔ)償方式信息。在上述步驟105至步驟106 的過程中,每一個(gè)組件在構(gòu)建時(shí)獲取了其依賴的組件,判斷獲取到的組件是否 是臨時(shí)組件,如果是臨時(shí)組件,則將所獲取的臨時(shí)組件的信息、該構(gòu)建的組件 (即待補(bǔ)償組件)的信息以及對應(yīng)的補(bǔ)償方式信息(創(chuàng)建依賴補(bǔ)償還是屬性依 賴補(bǔ)償)登記到補(bǔ)償組件列表中;如果不是臨時(shí)組件,則不進(jìn)行上述操作,這 樣,步驟107中,登記在補(bǔ)償組件列表中的所有正式組件,都利用補(bǔ)償組件列表
13中與其對應(yīng)的臨時(shí)組件信息和補(bǔ)償方式信息,執(zhí)行一次上述循環(huán)依賴補(bǔ)償步驟 中的遍歷后替換操作或調(diào)用及替換操作。
方法3、預(yù)先在臨時(shí)組件中創(chuàng)建能夠登記循環(huán)依賴切割點(diǎn)信息的補(bǔ)償信息 表;將依賴于該臨時(shí)組件的組件以及其與臨時(shí)組件的依賴關(guān)系(是創(chuàng)建依賴還 是循環(huán)依賴)登記在臨時(shí)組件的補(bǔ)償信息表中,這里由于本實(shí)施方式中存在多 種依賴關(guān)系,因此除依賴于臨時(shí)組件的組件之外,還至少需要將與其對應(yīng)的依 賴關(guān)系登記在補(bǔ)償信息表中;在循環(huán)依賴補(bǔ)償步驟107中,對所有登記在臨時(shí)組 件中的補(bǔ)償信息表中的組件,根據(jù)登記的依賴關(guān)系是創(chuàng)建依賴還是屬性依賴, 執(zhí)行一次上述循環(huán)依賴補(bǔ)償步驟中的遍歷后替換操作或調(diào)用及替換操作。
通過在臨時(shí)組件中設(shè)置的包括補(bǔ)償組件和依賴關(guān)系在內(nèi)的補(bǔ)償信息表中, 登記依賴于臨時(shí)組件的組件及其與臨時(shí)組件的依賴關(guān)系,能夠在循環(huán)補(bǔ)償歩驟 中,針對所有補(bǔ)償組件,按照不同的依賴關(guān)系進(jìn)行不同的循環(huán)依賴補(bǔ)償,從而, 不僅能夠支持存在由一種依賴關(guān)系造成的循環(huán)依賴關(guān)系,而且能夠支持存在由 多種依賴關(guān)系造成的循壞依賴關(guān)系,進(jìn)一步提高了軟件系統(tǒng)的設(shè)計(jì)開發(fā)效率。
由于回調(diào)函數(shù)的運(yùn)行效率高于方式一和方式二中那樣取出補(bǔ)償組件列表或 補(bǔ)償信息表中的相關(guān)信息后再進(jìn)行相關(guān)處理的過程,因此,具有更高的運(yùn)行效 率。
以圖2所示的循環(huán)依賴環(huán)路為例來說明上述圖1所示組件構(gòu)建方法的處理過 程。在圖2中,箭頭表示創(chuàng)建依賴關(guān)系,組件A、 B和C之間的關(guān)系如下組件A 在創(chuàng)建時(shí)依賴組件B;組件B在創(chuàng)建時(shí)依賴組件C、組件C在創(chuàng)建時(shí)依賴組件A,由
此形成圖中所示的循環(huán)依賴環(huán)路。
在本例中,假設(shè)組件A被請求構(gòu)建且組件A、組件B和組件C都尚未被創(chuàng)建。 組件A的構(gòu)建過程如下
在步驟101中,由于組件A是第一次被請求構(gòu)建,因此,步驟101的判斷結(jié)果 為"是",進(jìn)入歩驟102中,在步驟102中,請求組件A在創(chuàng)建時(shí)所依賴的組件B, 轉(zhuǎn)入構(gòu)建組件B的步驟lOl,由于組件B也是第一次被請求構(gòu)建,因此,步驟IOI 的判斷結(jié)果為"是",進(jìn)入步驟102中,請求組件B在創(chuàng)建時(shí)所依賴的組件C,轉(zhuǎn)入
14構(gòu)建組件C的歩驟lOl,由于組件C也是第一次被請求構(gòu)建,因此,歩驟101的判 斷結(jié)果為"是",進(jìn)入步驟102中,請求組件C在創(chuàng)建時(shí)所依賴的組件A,轉(zhuǎn)入構(gòu)建 組件A的步驟lOl,由于組件A不是第一次被請求構(gòu)建,因此,歩驟101的判斷結(jié) 果為"否",進(jìn)入步驟104中,創(chuàng)建組件A的臨時(shí)組件A1,該臨時(shí)組件A1被返回給 組件C的構(gòu)建進(jìn)程。
這樣,在步驟105中,利用臨時(shí)組件A1構(gòu)建了依賴于組件A的組件C,在步驟 106中,根據(jù)被依賴關(guān)系,由于組件C被組件B依賴,因此首先利用組件C構(gòu)建了 組件B,再由于組件B被組件A依賴,因此,利用組件B構(gòu)建了作為切割點(diǎn)的組件A。 較佳的,本實(shí)施方式通過為組件構(gòu)建過程加排它鎖,保證對某個(gè)組件一次 只有一個(gè)構(gòu)建線程,在當(dāng)前構(gòu)建線程結(jié)束后,再解除該排他鎖。因此,本實(shí)施 方式還具有可以保證多線程環(huán)境下的安全性和過程原子性的效果。 本發(fā)明還提出了一種組件構(gòu)建裝置,參見圖3,該裝置包括 切割點(diǎn)確定模塊,用于確定循環(huán)依賴環(huán)路中作為切割點(diǎn)的第一組件; 臨時(shí)組件創(chuàng)建模塊,用于為所述切割點(diǎn)確定模塊確定的第一組件創(chuàng)建對 應(yīng)的臨時(shí)組件;
構(gòu)建執(zhí)行模塊,用于利用所述臨時(shí)組件創(chuàng)建模塊創(chuàng)建的臨時(shí)組件,構(gòu)建 循環(huán)依賴環(huán)路中依賴于第一組件的第二組件,并從第二組件開始,按照被依 賴關(guān)系依次構(gòu)建循環(huán)依賴環(huán)路中的其他組件,直至第一組件構(gòu)建完成;
回調(diào)補(bǔ)償模塊,用于利用所述構(gòu)建執(zhí)行模塊構(gòu)建的第一組件,更新第二 組件的構(gòu)建信息。
所述切割點(diǎn)確定模塊,在一個(gè)構(gòu)建線程中,在每一個(gè)組件被請求構(gòu)建時(shí), 判斷該組件是否是第一次被請求構(gòu)建,如果是,則判斷該組件是否存在依賴的 組件,如果存在,則請求構(gòu)建該依賴的組件;如果不是,則確定存在循環(huán)依賴 環(huán)路,并將該組件確定為循環(huán)依賴環(huán)路中作為切割點(diǎn)的第一組件。
所述回調(diào)補(bǔ)償模塊,在當(dāng)前創(chuàng)建線程中第二組件對第一組件存在創(chuàng)建依 賴時(shí),遍歷第二組件的所有字段,使用第一組件替換遍歷到的每一個(gè)所述臨 時(shí)組件;在當(dāng)前創(chuàng)建線程中第二組件對第一組件存在屬性依賴時(shí),以第一組件作為參數(shù),調(diào)用第二組件的屬性設(shè)置方法,把第二組件中的依賴屬性的值從 所述臨時(shí)組件替換為第一組件。
所述構(gòu)建執(zhí)行模塊在創(chuàng)建臨時(shí)組件時(shí),如果所述第一組件以接口形式對 外提供服務(wù),則按照動(dòng)態(tài)代理方法,產(chǎn)生繼承所述第一組件所有暴露的接口 的類,該類不包括依賴信息,將產(chǎn)生的該類作為所述第一組件對應(yīng)的臨時(shí)組 件;如果所述第一組件以類形式對外提供服務(wù),則按照二進(jìn)制代碼修改方法,
產(chǎn)生繼承所述第一組件的類,該類不包括依賴信息,將產(chǎn)生的該類作為所述 第一組件對應(yīng)的臨時(shí)組件。
上面,對本發(fā)明的組件構(gòu)建方法和裝置的實(shí)施方式進(jìn)行了說明,但是本發(fā) 明并不局限于上述的內(nèi)容,在本發(fā)明的精神和原則之內(nèi),可以進(jìn)行各種變更。
例如,在上述的實(shí)施方式中,以依賴關(guān)系是創(chuàng)建依賴和屬性依賴為例進(jìn)行 了說明,但是本發(fā)明不受此限制,本發(fā)明可以應(yīng)用于任何可能形成循環(huán)依賴關(guān) 系的依賴關(guān)系。
另外,在上述的實(shí)施方式中,以補(bǔ)償組件列表、補(bǔ)償信息表以及回調(diào)函數(shù) 三種方式登記循環(huán)依賴切割點(diǎn)信息,但是本發(fā)明不受此限制,本發(fā)明可以應(yīng)用 其它方式來登記相關(guān)的循環(huán)依賴切割點(diǎn)信息。
此外,在上述的實(shí)施方式中,臨時(shí)組件從型上與正式組件兼容,但是,臨 時(shí)組件不受此局限,根據(jù)系統(tǒng)運(yùn)行的具體環(huán)境,也可以具有其它與正式組件不 兼容的型。
總而言之,以上所述僅為本發(fā)明的較佳實(shí)施方式而已,并不用以限制本發(fā) 明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均 應(yīng)包含在本發(fā)明保護(hù)的范圍之內(nèi)。
權(quán)利要求
1、一種組件構(gòu)建方法,其特征在于,該方法包括A、確定循環(huán)依賴環(huán)路中作為切割點(diǎn)的第一組件;B、為作為切割點(diǎn)的第一組件創(chuàng)建對應(yīng)的臨時(shí)組件;C、利用第一組件對應(yīng)的臨時(shí)組件,構(gòu)建循環(huán)依賴環(huán)路中依賴于第一組件的第二組件;D、從第二組件開始,按照被依賴關(guān)系依次構(gòu)建循環(huán)依賴環(huán)路中的其他組件,直至第一組件構(gòu)建完成;E、利用第一組件更新第二組件的構(gòu)建信息。
2、 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟A包括-在一個(gè)構(gòu)建線程中,在每一個(gè)組件被請求構(gòu)建時(shí),判斷該組件是否是第一次被請求構(gòu)建,如果是第一次被請求構(gòu)建,則繼續(xù)判斷該組件是否存在依賴的 組件,如果存在,則請求構(gòu)建該依賴的組件,返回步驟A;如果不是第一次被 請求構(gòu)建,則確定存在循環(huán)依賴環(huán)路,并將該組件確定為循環(huán)依賴環(huán)路中作為 切割點(diǎn)的第一組件。
3、 根據(jù)權(quán)利要求l所述的方法,其特征在于,所述步驟A包括將循環(huán)依賴環(huán)路中的任意一個(gè)組件確定為所述第一組件。
4、 根據(jù)權(quán)利要求l所述的方法,其特征在于,當(dāng)所述依賴為創(chuàng)建依賴時(shí),所述步驟E包括遍歷第二組件的所有字段,使用第一組件替換遍歷到的每一個(gè)所述臨時(shí)組件;當(dāng)所述依賴為屬性依賴時(shí),所述步驟E包括以第一組件作為參數(shù),調(diào)用第二組件的屬性設(shè)置方法,把第二組件中的依賴屬性的值從所述臨時(shí)組件替 換為第一組件。
5、 根據(jù)權(quán)利要求4所述的方法,其特征在于,該方法進(jìn)一步包括根據(jù)依賴關(guān)系的特點(diǎn)所需要的補(bǔ)償邏輯,預(yù)先設(shè)置針對創(chuàng)建依賴的第一類型回調(diào)函數(shù)和針對屬性依賴的第二類型回調(diào)函數(shù);在步驟B中,進(jìn)一步包括在第一組件對應(yīng)的臨時(shí)組件中設(shè)置對應(yīng)當(dāng)前依賴關(guān)系的回調(diào)函數(shù)注冊接口 ;在步驟C中進(jìn)一步包括所述第二組件利用所述臨時(shí)組件中的回調(diào)函數(shù)注冊接口,注冊第一類型回調(diào)函數(shù)或第二類型回調(diào)函數(shù);通過調(diào)用第二組件注冊的第一類型回調(diào)函數(shù)或第二類型回調(diào)函數(shù)執(zhí)行所述步驟E。
6、 根據(jù)權(quán)利要求4所述的方法,其特征在于,該方法進(jìn)一步包括每一個(gè)組件在構(gòu)建時(shí)獲取了其依賴的組件,判斷獲取到的組件是否是臨時(shí)組件,如果是臨時(shí)組件,則將所獲取的臨時(shí)組件的信息、該構(gòu)建的組件的信息以及對應(yīng)的補(bǔ)償方式信息登記到預(yù)先設(shè)置的補(bǔ)償組件列表中;第二組件利用補(bǔ)償組件列表中與其對應(yīng)的臨時(shí)組件信息和補(bǔ)償方式信息,執(zhí)行所述步驟E。
7、 根據(jù)權(quán)利要求4所述的方法,其特征在于,所述步驟B進(jìn)一步包括在臨時(shí)組件中創(chuàng)建補(bǔ)償信息表;所述步驟C進(jìn)一步包括將依賴于該臨時(shí)組件的第二組件以及其與臨時(shí)組件的依賴關(guān)系登記在臨時(shí)組件的補(bǔ)償信息表中;對登記在臨時(shí)組件的補(bǔ)償信息表中的第二組件,根據(jù)登記的依賴關(guān)系是創(chuàng)建依賴還是屬性依賴執(zhí)行所述步驟E。
8、 根據(jù)權(quán)利要求1至7中任意一項(xiàng)所述的方法,其特征在于,當(dāng)所述第一組件以接口形式對外提供服務(wù)時(shí),所述步驟B包括按照動(dòng)態(tài)代理方法,產(chǎn)生繼承所述第一組件所有暴露的接口的類,該類不包括依賴信息,將產(chǎn)生的該類作為所述第一組件對應(yīng)的臨時(shí)組件;當(dāng)所述第一組件以類形式對外提供服務(wù)時(shí),所述步驟B包括按照二進(jìn)制代碼修改方法,產(chǎn)生繼承所述第一組件的類,該類不包括依賴信息,將產(chǎn)生的該類作為所述第 一組件對應(yīng)的臨時(shí)組件。
9、 根據(jù)權(quán)利要求1至7中任意一項(xiàng)所述的方法,其特征在于,在一個(gè)構(gòu)建線程中執(zhí)行所述步驟A至步驟E;該方法進(jìn)一步包括為當(dāng)前的構(gòu)建線程加一排他鎖,在當(dāng)前構(gòu)建線程結(jié)束后,解除該排他鎖。
10、 一種組件構(gòu)建裝置,其特征在于,該裝置包括切割點(diǎn)確定模塊,用于確定循環(huán)依賴環(huán)路中作為切割點(diǎn)的第一組件;臨時(shí)組件創(chuàng)建模塊,用于為所述切割點(diǎn)確定模塊確定的第一組件創(chuàng)建對應(yīng)的臨時(shí)組件;構(gòu)建執(zhí)行模塊,用于利用所述臨時(shí)組件創(chuàng)建模塊創(chuàng)建的臨時(shí)組件,構(gòu)建循環(huán)依賴環(huán)路中依賴于第一組件的第二組件,并從第二組件開始,按照被依賴關(guān)系依次構(gòu)建循環(huán)依賴環(huán)路中的其他組件,直至第一組件構(gòu)建完成;回調(diào)補(bǔ)償模塊,用于利用所述構(gòu)建執(zhí)行模塊構(gòu)建的第一組件,更新第二組件的構(gòu)建信息。
11、 根據(jù)權(quán)利要求io所述的裝置,其特征在于,所述切割點(diǎn)確定模塊,在一個(gè)構(gòu)建線程中,在每一個(gè)組件被請求構(gòu)建時(shí),判斷該組件是否是第一次被請求構(gòu)建,如果是,則判斷該組件是否存在依賴的組件,如果存在,則請求構(gòu)建該依賴的組件;如果不是,則確定存在循環(huán)依賴環(huán)路,并將該組件確定為循環(huán)依賴環(huán)路中作為切害IJ點(diǎn)的第 一 組件。
12、 根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述回調(diào)補(bǔ)償模塊,在當(dāng)前創(chuàng)建線程中第二組件對第一組件存在創(chuàng)建依賴時(shí),遍歷第二組件的所有字段,使用第一組件替換遍歷到的每一個(gè)所述臨時(shí)組件;在當(dāng)前創(chuàng)建線程中第二組件對第一組件存在屬性依賴時(shí),以第一組件作為參數(shù),調(diào)用第二組件的屬性設(shè)置方法,把第二組件中的依賴屬性的值從所述臨時(shí)組件替換為第一組件。
13、 根據(jù)權(quán)利要求IO、 11或12所述的裝置,其特征在于,所述構(gòu)建執(zhí)行模塊在創(chuàng)建臨時(shí)組件時(shí),如果所述第一組件以接口形式對外提供服務(wù),則按照動(dòng)態(tài)代理方法,產(chǎn)生繼承所述第一組件所有暴露的接口的類,該類不包括依賴信息,將產(chǎn)生的該類作為所述第一組件對應(yīng)的臨時(shí)組件;如果所述第一組 以類形式對外提供服務(wù),則按照二進(jìn)制代碼修改方法,產(chǎn)生繼承所述第一組件的類,該類不包括依賴信息,將產(chǎn)生的該類作為所述第一組件對應(yīng)的臨時(shí)組件。
全文摘要
本發(fā)明公開了一種組件構(gòu)建方法和裝置,該方法包括確定循環(huán)依賴環(huán)路中作為切割點(diǎn)的第一組件;為作為切割點(diǎn)的第一組件創(chuàng)建對應(yīng)的臨時(shí)組件;利用第一組件對應(yīng)的臨時(shí)組件,構(gòu)建循環(huán)依賴環(huán)路中依賴于第一組件的第二組件;從第二組件開始,按照被依賴關(guān)系依次構(gòu)建循環(huán)依賴環(huán)路中的其他組件,直至第一組件構(gòu)建完成;利用第一組件更新第二組件的構(gòu)建信息。本發(fā)明能夠正確的構(gòu)建出循環(huán)依賴環(huán)路中的組件。
文檔編號G06F9/44GK101639775SQ20091009188
公開日2010年2月3日 申請日期2009年9月1日 優(yōu)先權(quán)日2009年9月1日
發(fā)明者何冠宇 申請人:用友軟件股份有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會(huì)獲得點(diǎn)贊!
1
海宁市| 河北省| 秦皇岛市| 溧阳市| 宁德市| 镇平县| 陵水| 山阴县| 夏河县| 将乐县| 马龙县| 永兴县| 新龙县| 江门市| 丹江口市| 霍州市| 门源| 枣庄市| 温泉县| 法库县| 荥阳市| 芦山县| 湘阴县| 西吉县| 方城县| 聂拉木县| 肇州县| 日土县| 宁晋县| 徐汇区| 双江| 永年县| 吴堡县| 连平县| 龙川县| 鹤峰县| 来凤县| 车险| 右玉县| 九寨沟县| 乌拉特前旗|