專(zhuān)利名稱(chēng):可擴(kuò)展地實(shí)現(xiàn)非功能邏輯的方法和設(shè)備及其系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及軟件開(kāi)發(fā)平臺(tái)的實(shí)現(xiàn),更具體地,涉及一種與功能邏 輯相分離地且可擴(kuò)展地實(shí)現(xiàn)非功能邏輯的方法和設(shè)備及其系統(tǒng)。
背景技術(shù):
當(dāng)今商業(yè)應(yīng)用不夠靈活的一個(gè)重要原因在于功能關(guān)注點(diǎn)與非功能 關(guān)注點(diǎn)的緊密且不可管理地糾纏在一起,其中功能關(guān)注點(diǎn)是指商業(yè)功 能和邏輯,而非功能關(guān)注點(diǎn)是指諸如性能、安全、監(jiān)控、可擴(kuò)展性等 方面。在程序代碼中功能關(guān)注點(diǎn)和非功能關(guān)注點(diǎn)的交叉極大地提高了
復(fù)雜度,從而使得很難理解、構(gòu)造、擴(kuò)展和重用,例如
— 理解方面商業(yè)邏輯代碼和NFR ( non國(guó)function requirement,非功能需求)相關(guān)代碼彼此編織,從而使 得難以從單一視角理解該代碼;
— 構(gòu)造方面需要謹(jǐn)慎地開(kāi)發(fā)代碼以考慮到功能和非功能方 面,從而需要更大的工作量和更多的技能;
一 可擴(kuò)展方面當(dāng)功能或非功能需求變化時(shí)改變代碼是相當(dāng) 困難的;
— 重用方面單純地重用功能或非功能代碼很困難, 因此,如下面將更詳細(xì)地解釋的那樣,關(guān)注點(diǎn)的分離逐漸成為面
向方面編程(Aspect Oriented Programming, AOP ) 、 J2EE (JavaTM 2 Platform Enterprise Edition Specification , JavaTM 2平臺(tái)企業(yè)編輯 規(guī)范)等現(xiàn)代軟件技術(shù)主要目標(biāo)和途徑。然而,這些技術(shù)的利用仍然 面臨極大的約束。 一方面,AOP只能處理簡(jiǎn)單的NFR任務(wù),如日志。 另一方面,盡管將容器引入到J2EE使其能夠處理復(fù)雜的NFR問(wèn)題 (如,事務(wù)),添加這種NFR支持通常是一件耗時(shí)的工作,其需要對(duì)
容器的實(shí)現(xiàn)有很好地了解并具有相關(guān)的技能。在當(dāng)今的J2EE容器中 支持定制和專(zhuān)門(mén)化NFR支持是相當(dāng)困難的,使得在J2EE中僅僅支持 一些通用NFR,從而留下其它NFR仍與功能代碼混在一起。
AOP是由Xerox PARX公司于20世紀(jì)90年代提出的一種編程范 式。AOP使開(kāi)發(fā)者能夠分離關(guān)注點(diǎn)。諸如日志、安全檢查、事務(wù)管 理等的很多非功能服務(wù)與功能服務(wù)分離開(kāi)來(lái)。同時(shí),這些非功能服務(wù) 可以由功能服務(wù)共享。 一旦非功能行為發(fā)生改變,不需要修改這些功 能服務(wù),而僅需要改變非功能服務(wù)。
才艮據(jù)來(lái)自AOSD ( Aspect-Oriented Software Development,面向 對(duì)象的軟件開(kāi)發(fā),對(duì)其的相關(guān)介紹在因特網(wǎng)上的網(wǎng)址http:〃aosd.net 上可以得到)的調(diào)查,有近100種AOP實(shí)現(xiàn)。對(duì)于基于Java的AOP 實(shí)現(xiàn),有超過(guò)20種實(shí)現(xiàn)。在此列出其中幾種比較成熟的AOP實(shí)現(xiàn) 1. Aspect J
AspectJ (商標(biāo))(對(duì)其的相關(guān)介紹在因特網(wǎng)上的網(wǎng)址 http:〃www.eclipse.org/aspecti上可以得到)是一種通用的對(duì)Java的 面向方面擴(kuò)展。在部署之前,AspectJ在編譯時(shí)進(jìn)行編織。AspectJ是 一種靜態(tài)編織,其借助預(yù)編譯器對(duì)源代碼進(jìn)行增強(qiáng)。AspectJ是成熟 的AOP實(shí)現(xiàn),但是它很復(fù)雜并且需要專(zhuān)用的Java編譯器。
L AspectWerkz
AspectWerkz (商標(biāo))(對(duì)其的相關(guān)介紹在因特網(wǎng)上的網(wǎng)址 http:〃aspectwerkz,codehaus.org上可以得到)是一種動(dòng)態(tài)的AOP框 架。AspectWerkz修改Java字節(jié)碼以實(shí)現(xiàn)方面編織。編織發(fā)生在兩 個(gè)不同的階段中,其中一個(gè)階段是類(lèi)加栽階段,另一個(gè)階段是激活階 段。
3. SpringFramework
SpringFramework (商標(biāo))(對(duì)其的相關(guān)介紹在因特網(wǎng)上的網(wǎng)址 httu:〃www.sDringframework.org/docs/wiki/Si)ring AOP Framework
jiimL上可以得到)是一種基于動(dòng)態(tài)代理的aop框架,其中動(dòng)態(tài)代理 來(lái)自于代理設(shè)計(jì)模式。動(dòng)態(tài)代理不需要為每個(gè)活動(dòng)的業(yè)務(wù)對(duì)象生成代
理。僅需要為將是活動(dòng)的接口和代理實(shí)現(xiàn)代理生成,并且運(yùn)行時(shí)將生
成代理對(duì)象。SpringFramework缺省使用由JDK提供的代理機(jī)制。 4. JBossAOP
JBoss AOP (商標(biāo))(對(duì)其的相關(guān)介紹在因特網(wǎng)上的網(wǎng)址 http:〃www.iboss.org/products/aoD上可以得到H吏用Javassist來(lái)改變 字節(jié)碼以在類(lèi)加載期間實(shí)現(xiàn)動(dòng)態(tài)編織。
對(duì)于已知的AOP實(shí)現(xiàn),非功能部分(方面)仍然由代碼編寫(xiě)而 成。在運(yùn)行時(shí)或編譯時(shí)將各個(gè)方面與功能代碼編織在一起以形成混合 代碼。因而,每個(gè)方面都將與功能代碼一起加栽到內(nèi)存中。如果有幾 個(gè)功能代碼使用同 一方面并且這些功能代碼都在內(nèi)存中,則內(nèi)存將有 該方面的幾個(gè)副本。此外,還沒(méi)有使用插件框架來(lái)為方面提供擴(kuò)展機(jī) 制的AOP實(shí)現(xiàn)。
在例如J2EE ( JavaTM 2平臺(tái)企業(yè)編輯規(guī)范,v1.4 )容器(對(duì)其的 相關(guān)介紹在因特網(wǎng)上的網(wǎng)址h加:〃iava sun.com上可以得到)的一些 應(yīng)用容器中, 一些經(jīng)常被應(yīng)用程序使用的非功能部分被分離出來(lái)由容 器提供。目前,J2EE容器支持的非功能包括認(rèn)證、事務(wù)、日志等。 然而,目前的J2EE不提供擴(kuò)展機(jī)制和框架以使第三方擴(kuò)展這些非功 能服務(wù)實(shí)現(xiàn)和將其編織到應(yīng)用中。
Mayer等人在其2002年發(fā)表的標(biāo)題為 "Lightweight plug-in-based application development"的書(shū)中,提出了插件概念作為 設(shè)計(jì)模式(所述設(shè)計(jì)模式具有Gamma等人1995年發(fā)表的、標(biāo)題為 "Design Patterns: Elements of Reusable Object-Oriented Software" 的書(shū)中提出的形式),并且給出了在Java中的示例實(shí)現(xiàn)。其體系結(jié)構(gòu) 包括加栽類(lèi)和識(shí)別那些使用反射將已知的接口實(shí)現(xiàn)為主接口的類(lèi)的插 件管理器,其相關(guān)內(nèi)容在Green等人于1997-2001年在Sun Microsystems, Inc.中發(fā)表的、標(biāo)題為"The Reflection API"的技術(shù)報(bào) 告中做了詳細(xì)介紹,所述文章在因特網(wǎng)上的網(wǎng)址 httD:〃iava.sun.com/docs/books/tutorial/reflect/上可k乂得至l] 。 Mayer等 人提出的示例實(shí)現(xiàn)允許使用多個(gè)插件,還可能用不同的接口,來(lái)擴(kuò)展
一個(gè)應(yīng)用,但是沒(méi)有提及將插件添加到其它插件中。
PluggableComponent是提供一種用于在運(yùn)行時(shí)交換組件的基礎(chǔ) 架構(gòu)或體系結(jié)構(gòu)的模式,其相關(guān)內(nèi)容在V"olter于1999年在In EuroPLoP ,99上發(fā)表的、標(biāo)題為"Pluggable Component - A Pattern for Interactive System Configuration"的文章中做了詳細(xì)介紹。該體 系結(jié)構(gòu)特征在于管理不同類(lèi)型的PluggableComponent的注冊(cè)表。該 注冊(cè)表由配置工具用來(lái)提供管理員可以用來(lái)配置其應(yīng)用的可用組件的列表。
Eclipse平臺(tái)是為構(gòu)造集成開(kāi)發(fā)環(huán)境而設(shè)計(jì)的,其相關(guān)內(nèi)容在 Object Technology International, Inc.于2001年7月發(fā)表的、標(biāo)題為 "Eclipse Platform Technical Overview"的技術(shù)報(bào)告中做了詳細(xì)介紹, 所述文章在因特網(wǎng)上的網(wǎng)址 h加:〃 www.ecliDse.org/whiteDapers/ecliDse-overview.pdf 上可以得到。 Eclipse平臺(tái)建立在用于發(fā)現(xiàn)、集成和運(yùn)行被稱(chēng)為插件的模塊的機(jī)制 上。任何插件自由定義新的擴(kuò)展點(diǎn)(對(duì)其的描述也可以在上述網(wǎng)址得 到)以及提供新的API以供其它插件使用。插件可以擴(kuò)展其它插件的 功能以及擴(kuò)展內(nèi)核。這提供了創(chuàng)建更復(fù)雜配置的靈活性。
然而,所有這些插件框架都作用在應(yīng)用層上.來(lái)自用戶(hù)的請(qǐng)求給 出了應(yīng)當(dāng)包括哪些插件以滿(mǎn)足該請(qǐng)求的指示符。然而在應(yīng)用容器中, 僅僅;f艮據(jù)用戶(hù)請(qǐng)求,不能直接得到有關(guān)應(yīng)當(dāng)調(diào)用哪些非功能插件的信 息。
在2007年5月31日公布的、公布號(hào)為US2007/0124797A1的、 Gupta等人的美國(guó)專(zhuān)利申請(qǐng)中提出了一種在網(wǎng)絡(luò)業(yè)務(wù)環(huán)境中創(chuàng)建、管 理、執(zhí)行策略的方法以及使用該方法的系統(tǒng),其意圖也是要將功能邏 輯與非功能邏輯分離開(kāi)來(lái)。所述系統(tǒng)包括策略管理器、策略執(zhí)行器、 客戶(hù)端和服務(wù)??蛻?hù)端包括請(qǐng)求服務(wù)的軟件。服務(wù)是網(wǎng)絡(luò)服務(wù),例如, 諸如登錄過(guò)程的應(yīng)用或可操作(或功能)過(guò)程和消息的接口和加密。 策略管理器用于指定功能,諸如日志、認(rèn)證、加密、高速緩存等,這 些不是核心商業(yè)邏輯,但是確實(shí)提供了非功能貢獻(xiàn)。策略管理器用于
分離商業(yè)關(guān)注點(diǎn)和非商業(yè)關(guān)注點(diǎn)。策略執(zhí)行器用于監(jiān)視和執(zhí)行經(jīng)由策
略管理器配置的策略。在該系統(tǒng)中,在OSI (開(kāi)放系統(tǒng)互連)7層模 型中的應(yīng)用層中實(shí)現(xiàn)策略管理器,并且在低層執(zhí)行所創(chuàng)建的策略。在 該系統(tǒng)中,沒(méi)有對(duì)網(wǎng)絡(luò)低層做任何改變。在該系統(tǒng)中,可以將策略實(shí) 現(xiàn)為消息的攔截器從而將策略無(wú)縫地引入消息流路徑中。或者,將策 略部署到網(wǎng)關(guān)和服務(wù)代理中。由網(wǎng)關(guān)和代理攔截消息以實(shí)現(xiàn)相應(yīng)的策 略。由上述內(nèi)容可知,該專(zhuān)利申請(qǐng)中公開(kāi)的系統(tǒng)通過(guò)策略管理器來(lái)配 置和滿(mǎn)足非功能需求,然而它并沒(méi)有提供一個(gè)可擴(kuò)展的方式來(lái)允許開(kāi) 發(fā)者擴(kuò)展和定制非功能需求的支持。此外,該專(zhuān)利申請(qǐng)中公開(kāi)的方法 將策略管理器置于客戶(hù)端和后端服務(wù)之間,實(shí)際上只能對(duì)服務(wù)接口訪 問(wèn)進(jìn)行控制,對(duì)多個(gè)服務(wù)之間的訪問(wèn)進(jìn)行控制則需要相應(yīng)添加多個(gè)策 略管理器,從而增加了網(wǎng)絡(luò)實(shí)現(xiàn)的復(fù)雜度并提高了實(shí)現(xiàn)成本和時(shí)間。
因此,現(xiàn)有技術(shù)中存在對(duì)方便快捷且可擴(kuò)展地分離功能邏輯和非 功能邏輯的機(jī)制的需求。
發(fā)明內(nèi)容
為了克服現(xiàn)有技術(shù)中存在的上述問(wèn)題,本發(fā)明提出了一種與功能 邏輯相分離地且可擴(kuò)展地實(shí)現(xiàn)非功能邏輯的方法和設(shè)備及其系統(tǒng)和計(jì) 算機(jī)程序產(chǎn)品。
為了實(shí)現(xiàn)上述目的,本發(fā)明提供了一種與功能邏輯相分離地且可 擴(kuò)展地實(shí)現(xiàn)非功能邏輯的方法,包括步驟基于加載的策略需求配置 獲得策略與所需的插件之間的關(guān)聯(lián)關(guān)系;根據(jù)所獲得的關(guān)聯(lián)關(guān)系,產(chǎn) 生插件上下文定義,所述插件上下文定義是與該插件有關(guān)的插件上下 文的一部分,其中所述插件上下文定義了插件所提供的服務(wù)以及對(duì)與 其有聯(lián)系的其它插件的引用;以及基于插件上下文定義而產(chǎn)生插件上 下文對(duì)象,其中,所述插件上下文對(duì)象是實(shí)例化的插件上下文定義。
為了實(shí)現(xiàn)上述目的,本發(fā)明還提供了一種與功能邏輯相分離地衛(wèi) 可擴(kuò)展地實(shí)現(xiàn)非功能邏輯的設(shè)備,包括應(yīng)用裝載器,用于將應(yīng)用的 策略需求配置加載到內(nèi)存;策略附加器,基于加載的策略需求配置森
得策略與所需的插件之間的關(guān)聯(lián)關(guān)系,以及根據(jù)所獲得的關(guān)聯(lián)關(guān)系, 產(chǎn)生插件上下文定義,所述插件上下文定義是與該插件有關(guān)的插件上 下文的一部分,其中所述插件上下文定義了插件所提供的服務(wù)以及對(duì)
與其有聯(lián)系的其它插件的引用;和應(yīng)用構(gòu)造器,基于插件上下文定義 而產(chǎn)生插件上下文對(duì)象,其中,所述插件上下文對(duì)象是實(shí)例化的插件 上下文定義。
為了實(shí)現(xiàn)上述目的,本發(fā)明還提供了一種分離功能邏輯與非功能
邏輯的系統(tǒng),包括應(yīng)用層實(shí)體,用于供用戶(hù)實(shí)現(xiàn)功能邏輯并利用基 礎(chǔ)架構(gòu)服務(wù)插件層實(shí)體提供的插件;基礎(chǔ)架構(gòu)服務(wù)插件層實(shí)體,用于 利用應(yīng)用運(yùn)行時(shí)層實(shí)體的服務(wù),實(shí)現(xiàn)所述插件;以及應(yīng)用運(yùn)行時(shí)層實(shí) 體,用于實(shí)現(xiàn)上述方法以供所述基礎(chǔ)架構(gòu)服務(wù)插件層實(shí)體調(diào)用。
為了實(shí)現(xiàn)上述目的,本發(fā)明還提供了一種計(jì)算機(jī)程序產(chǎn)品,該計(jì) 算機(jī)程序產(chǎn)品包括存儲(chǔ)在計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中的程序代碼,該程序 代碼的執(zhí)行實(shí)現(xiàn)了根據(jù)本發(fā)明的方法。
根據(jù)本發(fā)明的優(yōu)選實(shí)施例,為基礎(chǔ)架構(gòu)服務(wù)提供方提供了抽象層, 將應(yīng)用的非功能邏輯與應(yīng)用的功能邏輯分離開(kāi)來(lái),并且使得能夠靈活 地改變應(yīng)用的非功能配置而不用重新編譯、再部署該應(yīng)用。
根據(jù)本發(fā)明的優(yōu)選實(shí)施例,對(duì)運(yùn)行時(shí)構(gòu)造子進(jìn)行一些修改以添加 一些運(yùn)行時(shí)擴(kuò)展點(diǎn),諸如創(chuàng)建組件實(shí)例之前或之后的擴(kuò)展點(diǎn) Before(After)CreateComponentlnstance、調(diào)用組件實(shí)例之前或之后的 擴(kuò)展點(diǎn)Before(After)InvokeServiceMethod等。實(shí)際上,大多數(shù)基礎(chǔ) 架構(gòu)服務(wù),例如,日志、安全、事務(wù)等,在這些運(yùn)行時(shí)擴(kuò)展點(diǎn)的時(shí)間 段上活動(dòng)。換言之,通過(guò)擴(kuò)展這些擴(kuò)展點(diǎn),可以實(shí)現(xiàn)大多數(shù)基礎(chǔ)架構(gòu) 服務(wù)。
根據(jù)本發(fā)明的優(yōu)選實(shí)施例,引入了策略(非功能需求)注冊(cè)表和/ 或插件注冊(cè)表。策略注冊(cè)表存儲(chǔ)插件所支持的策略,而策略注冊(cè)表存 儲(chǔ)所有插件和維護(hù)插件之間的關(guān)系,例如,擴(kuò)展關(guān)系和/或依賴(lài)關(guān)系。
根據(jù)本發(fā)明的優(yōu)選實(shí)施例,改變應(yīng)用裝栽過(guò)程以將應(yīng)用的策略配 置映射到插件的依賴(lài)關(guān)系上。此外,所獲得的插件的依賴(lài)關(guān)系被存儲(chǔ)
在插件上下文實(shí)體中,其中所述插件上下文實(shí)體附接于應(yīng)用的相應(yīng)的 運(yùn)行時(shí)對(duì)象上。這樣,可以直接定位所依賴(lài)的插件,而不需要在應(yīng)用 的執(zhí)行期間查詢(xún)策略注冊(cè)表和插件注冊(cè)表。
根據(jù)本發(fā)明的優(yōu)選實(shí)施例,能夠方便快捷且可擴(kuò)展地實(shí)現(xiàn)應(yīng)用的 功能邏輯和非功能邏輯的分離。
此外,根據(jù)本發(fā)明的優(yōu)選實(shí)施例,在應(yīng)用執(zhí)行期間相關(guān)的插件將 被直接調(diào)用無(wú)需查詢(xún)注冊(cè)表進(jìn)行定位從而提高了運(yùn)行性能。
與AOP技術(shù)相比,本發(fā)明可以保持對(duì)應(yīng)用的全局綜覽,從而, 可以實(shí)現(xiàn)事務(wù)的復(fù)雜策略等。而且,可以以可擴(kuò)展的方式開(kāi)發(fā)服務(wù)于 策略的基礎(chǔ)架構(gòu)服務(wù)。
與在當(dāng)前應(yīng)用容器(例如,Java)中的策略支持相比,本發(fā)明可 以以可擴(kuò)展的方式開(kāi)發(fā)基礎(chǔ)架構(gòu)服務(wù),同時(shí)可以?xún)H由J2EE容器提供 商進(jìn)行對(duì)當(dāng)前應(yīng)用容器中基礎(chǔ)架構(gòu)服務(wù)的改變或擴(kuò)展。
與傳統(tǒng)的擴(kuò)展機(jī)制相比,本發(fā)明使得能夠根據(jù)應(yīng)用配置對(duì)基礎(chǔ)架 構(gòu)服務(wù)插件進(jìn)行隱式調(diào)用。
從下面結(jié)合附圖的詳細(xì)描述中,本發(fā)明將會(huì)更易于理解,其中, 相同的附圖標(biāo)記表示相同的結(jié)構(gòu)元素,并且,附圖中
圖1示出了根據(jù)本發(fā)明的支持功能邏輯與非功能邏輯相分離的系 統(tǒng)體系結(jié)構(gòu)圖2示出了基于圖l所示的系統(tǒng)體系結(jié)構(gòu)實(shí)現(xiàn)期望的應(yīng)用的流程
圖3是示出根據(jù)本發(fā)明的系統(tǒng)體系結(jié)構(gòu)進(jìn)行的應(yīng)用引導(dǎo)過(guò)程的信 息流圖4是示出根據(jù)本發(fā)明的系統(tǒng)體系結(jié)構(gòu)進(jìn)行的應(yīng)用引導(dǎo)過(guò)程的流 程圖5是示出運(yùn)行時(shí)擴(kuò)展點(diǎn)和運(yùn)行時(shí)應(yīng)用對(duì)象之間的關(guān)系的圖; 圖6是示例性地示出在插件上下文中插件之間的擴(kuò)展關(guān)系的圖;圖7是示例性地示出在插件上下文中插件之間的依賴(lài)關(guān)系的和
圖8示意性地示出了其中可以實(shí)現(xiàn)本發(fā)明的實(shí)施方式的計(jì)算機(jī)系統(tǒng)。
具體實(shí)施例方式
下面,參考圖l描述根據(jù)本發(fā)明的支持功能邏輯與非功能邏輯的 分離并實(shí)現(xiàn)非功能邏輯的系統(tǒng)的系統(tǒng)體系結(jié)構(gòu)。
如圖l所示,系統(tǒng)體系結(jié)構(gòu)從下至上分為3層,即,應(yīng)用運(yùn)行時(shí) 層、基礎(chǔ)架構(gòu)服務(wù)插件層和應(yīng)用層。
應(yīng)用運(yùn)行時(shí)層包括兩個(gè)子層,即,應(yīng)用運(yùn)行時(shí)核心子層117和基 礎(chǔ)架構(gòu)服務(wù)插件框架子層115。
在應(yīng)用運(yùn)行時(shí)核心子層117中,包括如下部分應(yīng)用裝載器127、 應(yīng)用構(gòu)造器129、和應(yīng)用構(gòu)造子單元131。應(yīng)用構(gòu)造器129為應(yīng)用的組 件生成運(yùn)行時(shí)對(duì)象以及組件之間的鏈接。在應(yīng)用的引導(dǎo)期間(即,準(zhǔn) 備好運(yùn)行期間)使用應(yīng)用構(gòu)造器129。應(yīng)用構(gòu)造子單元131用于創(chuàng)建 組件實(shí)例或建立組件實(shí)例之間的通信。在應(yīng)用的運(yùn)行期間使用應(yīng)用構(gòu) 造子單元131。上述各部分除了具有本領(lǐng)域技術(shù)人員所公知的功能之 外,為了實(shí)現(xiàn)本發(fā)明還對(duì)其進(jìn)行了一些修改,其中,應(yīng)用構(gòu)造子單元 131 被修改以添加運(yùn)行時(shí)擴(kuò)展點(diǎn),諸如 , BeforeComponentlnstanceCreation 和 AfterComponentlnstanceCreation等,其中所述運(yùn)行時(shí)擴(kuò)展點(diǎn)是指供 應(yīng)用運(yùn)行時(shí)核心子層117調(diào)用的擴(kuò)展點(diǎn)。從對(duì)于Eclipse的介紹中可 知,擴(kuò)展點(diǎn)是指在應(yīng)用中提供的某一個(gè)點(diǎn),通過(guò)該點(diǎn)第三方可以在應(yīng) 用中添加其自己的功能模塊來(lái)擴(kuò)展原有的應(yīng)用。應(yīng)用裝載器127被修
改以調(diào)用下面將描述的策略附加器125,策略附加器125通過(guò)基于來(lái) 自應(yīng)用裝載器127的策略需求配置查詢(xún)下面將描述的插件注冊(cè)表,將 應(yīng)用的策略配置映射到支持的插件。應(yīng)用構(gòu)造器129被修改以不僅產(chǎn) 生應(yīng)用運(yùn)行時(shí)對(duì)象,而且根據(jù)來(lái)自策略附加器的輸入而產(chǎn)生相關(guān)的插
件上下文。所謂的插件上下文包括插件所提供的服務(wù)以及對(duì)與其有聯(lián) 系的其它插件的引用。
在基礎(chǔ)架構(gòu)服務(wù)插件框架子層115中,包括如下部分插件注冊(cè) 表121和策略附加器125??蛇x地,還包括策略注冊(cè)表119和策略匹 配器123。策略注冊(cè)表119存儲(chǔ)了插件所支持的策略以及策略之間的 關(guān)系,例如,策略的包含關(guān)系,如個(gè)人身份認(rèn)證包括口令認(rèn)證、指紋 認(rèn)證、虹膜認(rèn)證等。實(shí)際上,策略注冊(cè)表119定義了系統(tǒng)所支持的策 略能力。而插件注冊(cè)表121存儲(chǔ)了有關(guān)插件的信息以及插件之間的關(guān) 系。該關(guān)系,例如,包括插件之間的擴(kuò)展關(guān)系和/或依賴(lài)關(guān)系。根據(jù)本 發(fā)明,策略附加器125可以直接查詢(xún)插件注冊(cè)表121而將應(yīng)用的策略 配置映射到支持的插件,并返回策略需求配置與支持的插件之間的關(guān) 聯(lián)關(guān)系。在這種情況下,對(duì)策略需求配置的定義必須具體到每個(gè)插件, 也就是說(shuō),對(duì)插件注冊(cè)表的入口定義更加具體,這相對(duì)復(fù)雜且比較耗 時(shí)。根據(jù)本發(fā)明的一個(gè)優(yōu)選實(shí)施例,策略附加器125可以先將策略需 求配置的定義傳送給策略匹配器123,策略匹配器123從中分析出所 需的策略并據(jù)此查詢(xún)策略注冊(cè)表119以確定本系統(tǒng)架構(gòu)是否支持所要 求的策略配置。如果支持的話(huà),才相應(yīng)地查詢(xún)插件注冊(cè)表121而獲得 策略和插件之間的關(guān)聯(lián)關(guān)系(即,句柄),并將其發(fā)送給策略附加器
125。在這種情況下,能夠提高系統(tǒng)的運(yùn)行效率并縮短引導(dǎo)所需的時(shí)間。 策略附加器125根據(jù)所獲得的關(guān)聯(lián)關(guān)系,產(chǎn)生應(yīng)用的插件上下文
定義,其中包括與所述插件實(shí)例的關(guān)聯(lián)(即,句柄),并將其發(fā)送到
應(yīng)用構(gòu)造器129。
基礎(chǔ)架構(gòu)服務(wù)插件層包括由基礎(chǔ)架構(gòu)服務(wù)開(kāi)發(fā)者基于應(yīng)用運(yùn)行時(shí)
層提供的非功能邏輯而開(kāi)發(fā)的向應(yīng)用層提供的各種服務(wù)插件,例如,
事務(wù)107、安全109、日志lll,以及其它服務(wù)插件113。所述其它服
務(wù)插件113可以是在應(yīng)用運(yùn)行時(shí)層上可以實(shí)現(xiàn)的任何插件。通過(guò)擴(kuò)展
運(yùn)行時(shí)擴(kuò)展點(diǎn)而實(shí)現(xiàn)這些服務(wù)插件。
應(yīng)用層包括用戶(hù)(諸如,軟件開(kāi)發(fā)者)期望實(shí)現(xiàn)的各種應(yīng)用,這
些應(yīng)用例如是航程及信用卡點(diǎn)數(shù)交換系統(tǒng)101、在線(xiàn)游戲103、以及其
它應(yīng)用105。所述其它應(yīng)用105可以是需要調(diào)用基礎(chǔ)架構(gòu)服務(wù)插件層 提供的服務(wù)插件的任何應(yīng)用。當(dāng)用戶(hù)在基于本系統(tǒng)架構(gòu)的平臺(tái)上實(shí)現(xiàn) 該應(yīng)用時(shí),功能邏輯在應(yīng)用層內(nèi)實(shí)現(xiàn),并且根據(jù)策略需求配置通過(guò)在 應(yīng)用構(gòu)造子單元131中定義的運(yùn)行時(shí)擴(kuò)展點(diǎn)來(lái)調(diào)用基礎(chǔ)架構(gòu)服務(wù)插件,從而實(shí)現(xiàn)非功能邏輯。通過(guò)功能邏輯與非功能邏輯的結(jié)合,最終 實(shí)現(xiàn)用戶(hù)期望的應(yīng)用。
此外,在插件中可以進(jìn)一步定義指向其它插件的擴(kuò)展點(diǎn),以實(shí)現(xiàn)進(jìn)一步的功能。如前面所述的,插件之間的關(guān)系包括擴(kuò)展關(guān)系和/或依 賴(lài)關(guān)系,且所述關(guān)系也存儲(chǔ)在插件注冊(cè)表121中。當(dāng)然,根據(jù)需要,還可以定義插件之間的其他關(guān)系。在此,插件之間的擴(kuò)展關(guān)系是指在一個(gè)插件中提供其它擴(kuò)展點(diǎn),并且在符合一定條件的情況下,才可以擴(kuò)展該擴(kuò)展點(diǎn)。依賴(lài)關(guān)系是指在運(yùn)行時(shí)對(duì)一個(gè)插件的實(shí)例化依賴(lài)于另 一插件的實(shí)現(xiàn)結(jié)果。在下面將舉例說(shuō)明插件之間的這兩種關(guān)系。
圖2示出了用戶(hù)基于根據(jù)本發(fā)明的系統(tǒng)架構(gòu)實(shí)現(xiàn)所期望的應(yīng)用的 過(guò)程。
在步驟202中,用戶(hù)在基于本發(fā)明的系統(tǒng)體系結(jié)構(gòu)的平臺(tái)上定義功能邏輯以及策略需求配置,并將其加載到內(nèi)存中。用戶(hù)可以在任意 編程平臺(tái)上使用任意編程語(yǔ)言來(lái)定義功能模塊,例如,用于可以在 WindowsTM開(kāi)發(fā)平臺(tái)上使用Java語(yǔ)言來(lái)編寫(xiě)功能模塊,其中,在需 要調(diào)用非功能模塊之處進(jìn)行聲明,即,給出需求描述即可。
在步驟204中,在內(nèi)存中執(zhí)行應(yīng)用引導(dǎo)過(guò)程。關(guān)于步驟204的具體執(zhí)行過(guò)程,后面將進(jìn)行詳細(xì)說(shuō)明。
在步驟206中,在運(yùn)行時(shí)應(yīng)用構(gòu)造子單元131擴(kuò)展在步驟204中產(chǎn)生的擴(kuò)展點(diǎn),即,調(diào)用插件的注入點(diǎn),并在運(yùn)行時(shí)創(chuàng)建對(duì)應(yīng)插件的 實(shí)例以執(zhí)行相應(yīng)功能。
圖3示出根據(jù)本發(fā)明的系統(tǒng)體系結(jié)構(gòu)中的應(yīng)用引導(dǎo)過(guò)程中的信息流的流向。其中在信息流l中,包括根據(jù)功能需求和非功能需求分別定義的應(yīng)用 的組件功能和策略需求配置;
在信息流2中,包括根據(jù)功能需求定義的應(yīng)用的組件功能;
在信息流3、 4、 5中,包括^f艮據(jù)非功能需求定義的策略需求配置 信息,其在應(yīng)用裝載器127、策略附加器125、和策略匹配器123處可 能有相同或不同的形式,這根據(jù)需要而定;
在信息流6中,包括為所獲得的策略和支持的插件之間的關(guān)聯(lián)關(guān)
系,諸如,包括實(shí)現(xiàn)非功能需要所需插件的描述和句柄;
在信息流7中,包括插件上下文定義,它是與該插件有關(guān)的插件 上下文的一部分,其中所述插件上下文定義了插件所提供的服務(wù)以及 對(duì)與其有聯(lián)系的其它插件的引用;
在信息流8中,包括應(yīng)用運(yùn)行時(shí)對(duì)象、插件上下文對(duì)象及其關(guān)聯(lián)。 下面參照?qǐng)D4,描述根據(jù)本發(fā)明的系統(tǒng)體系結(jié)構(gòu)中的應(yīng)用引導(dǎo)過(guò)程。
在步驟402中,應(yīng)用裝載器127將應(yīng)用的組件功能定義和策略需 求配置加載到內(nèi)存中,即,將應(yīng)用包部署到應(yīng)用運(yùn)行時(shí)。所謂的應(yīng)用 運(yùn)行時(shí)是指已經(jīng)將應(yīng)用包裝載到內(nèi)存中,此時(shí),該應(yīng)用包已經(jīng)處于"就 緒"狀態(tài),隨時(shí)可以被調(diào)用。
在步驟404中,應(yīng)用裝栽器127根據(jù)組件功能定義產(chǎn)生組件定義 (即,功能邏輯模塊),并將策略需求配置傳遞給策略附加器125, 然后傳遞給策略匹配器123,在此過(guò)程中,所述策略需求配置可以根 據(jù)需要有不同的形式。
應(yīng)用的組件功能定義的加栽和產(chǎn)生組件定義可以采用已有技術(shù), 例如使用SCA (服務(wù)組件體系結(jié)構(gòu))的運(yùn)行環(huán)境Tuscany作為基層的 應(yīng)用運(yùn)行就可以實(shí)現(xiàn),因此省略對(duì)其的詳細(xì)描述。而且,對(duì)于實(shí)現(xiàn)本 發(fā)明目的而言,上述過(guò)程不是必需的。
在步驟406中,策略匹配器123基于策略需求配置查詢(xún)插件注冊(cè) 表121以獲得用于策略需求配置的支持的插件,并將策略和所需的插 件之間的關(guān)聯(lián)關(guān)系(包括該插件的描述和句柄)返回給策略附加器 125??蛇x地,在步驟406,策略匹配器123先查詢(xún)策略注冊(cè)表119, 以獲知本系統(tǒng)是否支持所需求的插件。如果支持的話(huà),查詢(xún)插件注冊(cè)
表121,并返回策略和所需的插件之間的關(guān)聯(lián)關(guān)系,否則,返回異常 指示。
在步驟408中,策略附加器125根據(jù)所接收的該插件的描述和句 柄,為該插件產(chǎn)生插件上下文定義,所述插件上下文定義是與該插件 有關(guān)的插件上下文的一部分,其中所述插件上下文定義了插件所提供 的服務(wù),其與該插件的句柄相關(guān)聯(lián),以及對(duì)與其有聯(lián)系的其它插件的 引用;其中,可以將所述插件上下文形成為鏈表的形式或樹(shù)狀結(jié)構(gòu), 或者本領(lǐng)域技術(shù)人員所知的其它任何結(jié)構(gòu)。
在步驟410中,應(yīng)用構(gòu)造器129基于組件定義而產(chǎn)生應(yīng)用運(yùn)行時(shí) 對(duì)象,并基于插件上下文定義而產(chǎn)生插件上下文對(duì)象,并將該插件上 下文對(duì)象與相應(yīng)的應(yīng)用運(yùn)行時(shí)對(duì)象相關(guān)聯(lián),其中,所述插件上下文對(duì) 象是實(shí)例化的插件上下文定義。
參照?qǐng)D5,其中示出了運(yùn)行時(shí)擴(kuò)展點(diǎn)和運(yùn)行時(shí)應(yīng)用對(duì)象之間的關(guān) 系。如圖5所示,應(yīng)用運(yùn)行時(shí)對(duì)象與多個(gè)運(yùn)行時(shí)擴(kuò)展點(diǎn)相關(guān)聯(lián),所述 運(yùn)行時(shí)擴(kuò)展點(diǎn)包括兩大類(lèi), 一類(lèi)是與服務(wù)調(diào)用有關(guān)的擴(kuò)展點(diǎn),諸如調(diào) 用組件實(shí)例之前的擴(kuò)展點(diǎn)BeforelnvokeServiceMethod和調(diào)用組件實(shí) 例之后的擴(kuò)展點(diǎn)AfterlnvokeServiceMethod;另一類(lèi)是與組件創(chuàng)建有 關(guān)的擴(kuò)展點(diǎn),諸如創(chuàng)建組件實(shí)例之前的擴(kuò)展點(diǎn) BeforeCreateComponentlnstance和創(chuàng)建組件實(shí)例之后的擴(kuò)展點(diǎn) AfterCreateComponentlnstance。當(dāng)與用戶(hù)交互的過(guò)程中由構(gòu)造子創(chuàng) 建運(yùn)行時(shí)擴(kuò)展點(diǎn)的實(shí)例時(shí),系統(tǒng)插件上下文中所包含的與插件實(shí)例的 關(guān)聯(lián)關(guān)系而直接找到并調(diào)用對(duì)應(yīng)插件。
下面,以在線(xiàn)支付系統(tǒng)為例,說(shuō)明本發(fā)明的參考實(shí)現(xiàn)。在本參考 實(shí)現(xiàn)中,可使用SCA (服務(wù)組件體系結(jié)構(gòu))運(yùn)行時(shí)環(huán)境Tuscany作為 基層的應(yīng)用運(yùn)行時(shí)環(huán)境。在此,使用簡(jiǎn)化的偽代碼以便更好地圖解其 后的機(jī)制。在如圖1所示的基礎(chǔ)架構(gòu)服務(wù)插件層中實(shí)現(xiàn)作為示例的基 礎(chǔ)架構(gòu)服務(wù)插件"日志"。而且,作為示例的應(yīng)用,在線(xiàn)支付系統(tǒng), 用來(lái)展示如何使用"日志"插件。該應(yīng)用使用Paypal來(lái)提供在線(xiàn)支付 服務(wù),并且用戶(hù)使用"日志"來(lái)記錄Paypal服務(wù)的使用。
1.應(yīng)用運(yùn)行時(shí)核心子層117的修改
應(yīng)用運(yùn)行時(shí)核心子層117的#"改包括<務(wù)改應(yīng)用構(gòu)造子單元131、 應(yīng)用裝載器127、和應(yīng)用構(gòu)造器129。下面給修改的偽代碼加了下劃線(xiàn)。
首先,為了使應(yīng)用運(yùn)行時(shí)知道Paypal組件對(duì)日志的需求并從而調(diào) 用"日志",需要如下修改運(yùn)行時(shí)應(yīng)用裝載器127 ,ComponentLoader, 以創(chuàng)建插件上下文定義
〃用于加栽scdl文件的組件標(biāo)簽信息的Tuscany裝栽器
public class ComponentLoader extends LoaderExtension<ComponentDefinition< { PluginContextDefinition pcd = null; 〃插件定義信息類(lèi)型 public ComponentDefinition< > load(CompositeComponent parent,
XMLStreamReader reader, DeploymentContext deploymentContext)
throws XMLStreamException, LoaderException {
〃解析插件定義信息
String intents = reader.getAttributeValue("null,"requires"); pcd = processListoflntentfintents);
方法"ComponentLoader"將解析應(yīng)用配置并識(shí)別一些關(guān)鍵詞, 如"需求"。關(guān)鍵詞"需求"用來(lái)指定期望的基礎(chǔ)架構(gòu)服務(wù)(intent)。 方法"processListoflntent"將調(diào)用策略附加器125來(lái)產(chǎn)生對(duì)應(yīng)的插件 上下文定義。
其次,需要如下#"改應(yīng)用構(gòu)造器129, JavaComponentBuilder, 來(lái)將插件上下文與對(duì)應(yīng)的組件相關(guān)聯(lián)
〃用于根據(jù)組件定義建立組件的Tuscany核心API
public class JavaComponentBuilder extends
ComponentBuilderExtension<JavaImplementation> { public AtomicComponent build(CompositeCoinponent parent, ComponentDefinition<JavaImplementation> definition, DeploymentContext deployment) throws BuilderConfigException {
JavaAtomicComponent component = new JavaAtomicComponent(definition
.getName(), configuration); 〃創(chuàng)建插件上下文
comuonent.createPluginContext(definition.getPluginContextDefinition());
最后,為了使運(yùn)行時(shí)可擴(kuò)展,需要指明在運(yùn)行時(shí)應(yīng)用構(gòu)造子單元 131中的運(yùn)行時(shí)擴(kuò)展點(diǎn)。為了實(shí)現(xiàn)在調(diào)用服務(wù)之前觸發(fā)的擴(kuò)展點(diǎn) "BeforelnvokeServiceMethod",需要在獲得組件實(shí)例并調(diào)用其服務(wù) 之前對(duì)擴(kuò)展點(diǎn)"BeforelnvokeServiceMethod"進(jìn)行聲明,然后,在實(shí) 現(xiàn)應(yīng)用構(gòu)造子單元131時(shí),在從應(yīng)用構(gòu)造器129獲得的插件上下文中 找出所有插件擴(kuò)展的"System.BeforeInvokeServiceMethod"擴(kuò)展點(diǎn), 并且對(duì)于每個(gè)插件,向其釋放鏈接添加其子插件上下文并運(yùn)行該插件。 下面示出了對(duì)服務(wù)調(diào)用類(lèi)PojoTargetlnvoker的修改
〃用于調(diào)用組件服務(wù)的T^iscany核心API
public abstract class ProjoTargetlnvoker implements Targetlnvoker { public Object invokeTarget(final Object payload) throws InvocationTargetException { try{
〃觸發(fā)擴(kuò)展點(diǎn)管理功能
processBeforelnvokeServiceMethodf payload, instance); Object retj
〃獲得組件實(shí)例并調(diào)用其服務(wù)
if (payload != null && !payload,getClass().isArrayO) {
ret = operation.invoke(instance, payload); } else {
ret = operation.invoke(instance, (Object[]) payload);
return ret; } catch (IllegalAccessException e) {
〃激活擴(kuò)展其擴(kuò)展點(diǎn)的所有插件
public void processBeforelnvokeServiceMethod (object uavload,
AtomicComponentExtension instance) { 〃從組件實(shí)例獲得插件上下文 PluginContext nc= instance.getPluginContextf);
〃從插件上下文中找出所有擴(kuò)展了 "Svstem.BeforeInvokeServiceMethod"擴(kuò)展點(diǎn)的 插件
List<Extension> elist = Dc.getExtension("Svstem.BeforeInvokeServiceMethod");
//執(zhí)行所有插件
For(Extension e: elist)
i
e.runO;
通過(guò)4吏用方法"processBeforelnvokeServiceMethod",可以獲得 當(dāng)前組件實(shí)例的插件上下文。根據(jù)該上下文,可以獲得對(duì)插件"日志" 的引用"e",其擴(kuò)展了擴(kuò)展點(diǎn)"BeforelnvokeServiceMethod",接 著調(diào)用"日志"。注意,對(duì)"日志"的調(diào)用發(fā)生在服務(wù)調(diào)用 operation.invoke()之前。
2.基礎(chǔ)架構(gòu)服務(wù)插件框架子層115的實(shí)現(xiàn)
基礎(chǔ)架構(gòu)服務(wù)插件框架子層115包括插件注冊(cè)表121、策略匹配 器123和策略附加器125??蛇x地,還包括策略注冊(cè)表119。
首先,插件注冊(cè)表121維護(hù)插件的信息(例如,所提供的策略) 和插件之間的關(guān)系(例如,擴(kuò)展關(guān)系和/或依賴(lài)關(guān)系)。以下示出了按 照策略來(lái)索引插件以及按照擴(kuò)展點(diǎn)來(lái)索引插件的插件注冊(cè)表121的實(shí) 現(xiàn):
〃定義索引插件的注冊(cè)表
public class PluginRegistry {
public List<Plugin> getPluginsByPolicy(Policy policy);
public List<Plugin> getPluginsByExtensionPoint(ExtensionPoint ep);
插件類(lèi)維護(hù)所提供的插件的擴(kuò)展和擴(kuò)展點(diǎn)。以下示出了在插件中 對(duì)擴(kuò)展點(diǎn)的擴(kuò)展以及提供與該插件有擴(kuò)展關(guān)系和依賴(lài)關(guān)系的插件的擴(kuò)
展點(diǎn)的實(shí)現(xiàn)
〃插件定義
public class Plugin(
public List<Extension> getExtensions();
public List<ExtensionPoint> getExtensionPoints();
public List<Plugin> getDependentPlugins();
其次,策略注冊(cè)表119維護(hù)基礎(chǔ)架構(gòu)服務(wù)的需求和策略之間的映 射,其中策略描述了 一些可以應(yīng)用于服務(wù)組件或服務(wù)組件之間的交互 的能力或約束。以下示出了根據(jù)需求獲得策略的實(shí)現(xiàn)
〃定義索引策略的注冊(cè)表
public class PolicyRegistry {
public Policy getPolicy(String intent);
再次,策略匹配器123負(fù)責(zé)找到用于需求的支持的插件。以下示 出了首先根據(jù)需求獲得策略其后+艮據(jù)策略獲得插件的實(shí)現(xiàn)
〃提供策略和插件之間的匹配器
public class PolicyMatcher {
public List<Plugin> getPlugins (String intent) {
Policy policy = PolicyRegistry. getPolicy(intent); return PluginRegistry. getPluginsByPolicy(policy);
最后,策略附加器125為需求產(chǎn)生支持的插件的上下文定義。方 法"generatePluginContextDefinition"為插件構(gòu)造插件上下文定義, 而方法"buildPluginContextChain"根據(jù)插件的關(guān)系將插件上下文定 義組織為鏈表并返回該鏈表的首部。上述方法根據(jù)每個(gè)策略找出所有 插件,然后從插件注冊(cè)表121中找出相應(yīng)的插件定義,并且建立插件 定義上下文。
〃提供根據(jù)策略獲得插件定義上下文的機(jī)制 public class PolicyAttacher{
public List<PluginContextDefinition> getPluginContextDefinition(String intents) { List<String> intentList=getIntents(requires,policySets); List<PluginContextDefinition> result = new List<PluginContextDefinition>; for(String intent: intentList)( 〃根據(jù)每個(gè)策略找出所有插件
List<Plugin> plugins- PolicyMatcher. getPlugins(intent);
〃找出相應(yīng)的插件定義
List< PluginContextDefinition> pluginContextDefinitions =
generatePluginContextDefinition(pIugins)
〃建立插件定義上下文
PluginContextDefinition pluginContextDefinitionHeader =
buHdPluginContextChain(pluginContextDeflnitions,plugi
<formula>formula see original document page 22</formula>
方法"PluginContextDefintion"提供了一種為所需的插件層次結(jié) 構(gòu)建立上下文樹(shù)的方式。
〃定義插件上下文定義
<formula>formula see original document page 22</formula>
3.日志插件實(shí)現(xiàn)
插件的配置指定了其擴(kuò)展的擴(kuò)展點(diǎn)以及其提供的擴(kuò)展。在此,示 出了與"日志"插件有擴(kuò)展關(guān)系的擴(kuò)展點(diǎn)"過(guò)濾器"。下面,說(shuō)明了 "日志"插件的配置。
<formula>formula see original document page 22</formula>擴(kuò)展
<extension-point id-,,com.ibm.crl.plugin.log.FHter"
interface.class-,,com.ibm.crl.plugin.log.IFilter,, />〃擴(kuò)展點(diǎn) </component> </composite>
"日志"插件通過(guò)擴(kuò)展擴(kuò)展點(diǎn)"BeforelnvokeServiceMethod", 日志服務(wù)調(diào)用相關(guān)的信息。下面示出了 "日志"插件的具體實(shí)現(xiàn)
public class LogProcessor implements BeforelnvokeServiceMethod {
private Logger log = Logger.getLogger(this.getClass()); 〃記錄器啟動(dòng)
public void run() {
log.info(" componentname: "+ componentname + " operation: " + operation + " args: " + args + " Timestamp: " + System.currentTimeMillis()); 〃i已錄器i己錄
4.相關(guān)的代碼和在線(xiàn)支付系統(tǒng)的配置
下面示出了具有日志代碼的Paypal組件的偽代碼。
public class EPaypelServicelmpl implements EPaypelService {
private Logger log = Logger.getLogger(this.getClass());〃日志代碼
public List requestPayment(String companyName)
log.info("Classname: " + this.getClass() + " operation: requestPayment" + " args: "+ companyName+" timestamp: "+System.currentTimeMillis());〃日志代碼
doSomethingO;
使用"日志"插件,可以簡(jiǎn)單地將日志需求添加到在線(xiàn)支付應(yīng)用 的配置中,從而,從應(yīng)用代碼中移除日志代碼。以下示出了在線(xiàn)支付 系統(tǒng)的配置,并且日志需求用下劃線(xiàn)指示。
<composite xmlns="http:〃www.osoa.org/xmlns/sca/1.0" name-"Online Payment">
〈component name="EPaypelService" reciuires=',log''> implementation, Java
class="conUbm.crLpaypel.EPaypelServiceImpl" /> -reference name=,,paymentManagementOagis">
PaymentManagementComponent </rcference> </componcnt>
</composite>
下面還以上述"日志"插件為例,說(shuō)明插件之間的擴(kuò)展關(guān)系。 假設(shè)"日志"插件提供日志組件實(shí)例創(chuàng)建和服務(wù)方法調(diào)用的能力。 而且,"日志"插件提供擴(kuò)展點(diǎn)"過(guò)濾器"以添加過(guò)濾條件。
同時(shí),"ABC過(guò)濾器"插件擴(kuò)展"日志"插件的"過(guò)濾器"擴(kuò)展 點(diǎn),以便僅日志符合"ABC"條件的信息。
圖6示出了如何^^用插件上下文來(lái)定位插件的插件,而不用在應(yīng) 用的執(zhí)行期間額外查詢(xún)策略注冊(cè)表119和插件注冊(cè)表121。
插件上下文存儲(chǔ)插件的擴(kuò)展點(diǎn),在本示例中,為"過(guò)濾器"擴(kuò)展 點(diǎn)。而且,該擴(kuò)展點(diǎn)"過(guò)濾器"指向另一插件上下文,其存儲(chǔ)了所需 擴(kuò)展點(diǎn)的擴(kuò)展"ABC過(guò)濾器",即,擴(kuò)展了該擴(kuò)展點(diǎn)"過(guò)濾器"并 在此需要插件"ABC過(guò)濾器"。
下面還以上述"日志"插件為例,說(shuō)明插件之間的依賴(lài)關(guān)系。 假設(shè)存在"監(jiān)視器"插件,其為每個(gè)身份提供監(jiān)視組件實(shí)例創(chuàng)建 和方法調(diào)用的能力。此外,插件提供服務(wù)以獲得所選身份的當(dāng)前組件 實(shí)例數(shù)目。
同時(shí),"資源管理"插件提供限制每個(gè)身份的最大組件實(shí)例數(shù)目 的能力。該插件支持"監(jiān)視器"插件以獲得在為每個(gè)身份創(chuàng)建組件實(shí) 例之前獲得當(dāng)前組件實(shí)例數(shù)目。
圖7示出了如何將插件上下文用于插件的依賴(lài)插件,而不需要在 應(yīng)用的執(zhí)行期間額外查詢(xún)策略注冊(cè)表119和插件注冊(cè)表121。
插件上下文存儲(chǔ)了插件所提供且所需要的服務(wù)。而且,還存儲(chǔ)了 對(duì)依賴(lài)插件(即,提供所需服務(wù)的插件)的引用。在本示例中,插件 所提供的服務(wù)為限制最大組件實(shí)例數(shù)目,而其所需要的服務(wù)為"監(jiān)視 器"擴(kuò)展點(diǎn)來(lái)提供當(dāng)前的實(shí)例數(shù)目。該擴(kuò)展點(diǎn)"監(jiān)視器"指向另一插 件上下文,其存儲(chǔ)了所需擴(kuò)展點(diǎn)的擴(kuò)展"監(jiān)視器",即,擴(kuò)展了該擴(kuò) 展點(diǎn)"監(jiān)視器"并在此需要插件"監(jiān)視器"。
圖8示意性地表示了其中可以實(shí)現(xiàn)本發(fā)明的實(shí)施方式的計(jì)算機(jī)系 統(tǒng)。圖8中所示的計(jì)算機(jī)系統(tǒng)包括CPU(中央處理單元)801、 RAM(隨 機(jī)存取存儲(chǔ)器)802、 ROM(只讀存儲(chǔ)器)803、系統(tǒng)總線(xiàn)804, HD(硬盤(pán)) 控制器805、鍵盤(pán)控制器806、串行接口控制器807、并行接口控制器 808、顯示器控制器809、硬盤(pán)810、鍵盤(pán)8U、串行外部設(shè)備812、并 行外部設(shè)備813和顯示器814。在這些部件中,與系統(tǒng)總線(xiàn)804相連 的有CPU 801、 RAM 802、 ROM 803、 HD控制器805、鍵盤(pán)控制器 806,串行接口控制器807,并行接口控制器808和顯示器控制器809。 硬盤(pán)810與HD控制器805相連,鍵盤(pán)811與鍵盤(pán)控制器806相連, 串行外部設(shè)備812與串行接口控制器807相連,并行外部設(shè)備813與 并行接口控制器808相連,以及顯示器814與顯示器控制器809相連。
圖8中每個(gè)部件的功能在本技術(shù)領(lǐng)域內(nèi)都是眾所周知的,并且圖 8所示的結(jié)構(gòu)也是常規(guī)的。這種結(jié)構(gòu)不僅用于個(gè)人計(jì)算機(jī),而且用于 任何支持用戶(hù)開(kāi)發(fā)其所需要的應(yīng)用的開(kāi)發(fā)平臺(tái)。在不同的應(yīng)用中,圖 8中所示的某些部件可以被省略。圖8中所示的整個(gè)系統(tǒng)由通常作為
軟件存儲(chǔ)在硬盤(pán)810中、或者存儲(chǔ)在EPROM或者其它非易失性存儲(chǔ) 器中的計(jì)算機(jī)可讀指令控制。軟件也可從網(wǎng)絡(luò)(圖中未示出)下載。 或者存儲(chǔ)在硬盤(pán)810中,或者從網(wǎng)絡(luò)下載的軟件可被加載到RAM 802 中,并由CPU801執(zhí)行,以便完成由軟件確定的功能。
盡管圖8中描述的計(jì)算機(jī)系統(tǒng)能夠支持根據(jù)本發(fā)明的方法,但是 該計(jì)算機(jī)系統(tǒng)只是計(jì)算機(jī)系統(tǒng)的一個(gè)例子。本領(lǐng)域的熟練技術(shù)人員可 以理解,許多其它計(jì)算機(jī)系統(tǒng)設(shè)計(jì)也能實(shí)現(xiàn)本發(fā)明。
本發(fā)明還可以實(shí)現(xiàn)為一種例如由圖8所示計(jì)算機(jī)系統(tǒng)所使用的計(jì) 算機(jī)程序產(chǎn)品,其包含有用于本發(fā)明的方法的代碼。在使用之前,可 以把代碼存儲(chǔ)在其它計(jì)算機(jī)系統(tǒng)的存儲(chǔ)器中,例如,存儲(chǔ)在硬盤(pán)或諸 如光盤(pán)或軟盤(pán)的可移動(dòng)的存儲(chǔ)器中,或者經(jīng)由因特網(wǎng)或其它計(jì)算機(jī)網(wǎng) 絡(luò)進(jìn)行下栽。
從以上描述中,本發(fā)明的很多特征和優(yōu)點(diǎn)將清楚,并且,由此, 意圖由所附權(quán)利要求涵蓋本發(fā)明的所有這樣的特征、以及優(yōu)點(diǎn)。此外, 由于對(duì)于本領(lǐng)域的技術(shù)人員來(lái)說(shuō)、將容易出現(xiàn)大量修改和改變,所以,
不應(yīng)將本發(fā)明限于如所示出并描述的確切的構(gòu)造和操作。由此,可將 所有適用的修改和等價(jià)物視為落在本發(fā)明范圍內(nèi)。
權(quán)利要求
1. 一種與功能邏輯相分離地且可擴(kuò)展地實(shí)現(xiàn)非功能邏輯的方法,包括步驟基于加載的策略需求配置獲得策略與所需的插件之間的關(guān)聯(lián)關(guān)系;根據(jù)所獲得的關(guān)聯(lián)關(guān)系,產(chǎn)生插件上下文定義,所述插件上下文定義是與該插件有關(guān)的插件上下文的一部分,其中所述插件上下文定義了插件所提供的服務(wù)以及對(duì)與其有聯(lián)系的其它插件的引用;以及基于插件上下文定義而產(chǎn)生插件上下文對(duì)象,其中,所述插件上下文對(duì)象是實(shí)例化的插件上下文定義。
2. 如權(quán)利要求l所述的方法,其中,所述基于加栽的策略需求配 置獲得策略與所需的插件之間的關(guān)聯(lián)關(guān)系的步驟還包括基于策略需求配置查詢(xún)包含插件的描述和插件之間的關(guān)系的信息 的插件注冊(cè)表而獲得策略和所需的插件之間的關(guān)聯(lián)關(guān)系。
3. 如權(quán)利要求l所述的方法,其中,所述基于加栽的策略需求配 置獲得策略與所需的插件之間的關(guān)聯(lián)關(guān)系的步驟還包括基于策略需求配置查詢(xún)包含插件所支持的策略以及策略之間的關(guān) 系的信息的策略注冊(cè)表;以及基于所述策略注冊(cè)表的查詢(xún)結(jié)果,進(jìn)一步通過(guò)查詢(xún)插件注冊(cè)表將 所述策略需求配置映射到相應(yīng)的插件以獲得策略和所需的插件之間的 關(guān)聯(lián)關(guān)系,其中所述插件注冊(cè)表包含插件的描述和插件之間的關(guān)系的 信息。
4. 如權(quán)利要求l-3中任一項(xiàng)所述的方法,其中,還包括 定義應(yīng)用的策略需求配置。
5. 如權(quán)利要求4所述的方法,其中,還包括 定義應(yīng)用的組件功能;以及 根據(jù)加載的組件功能定義產(chǎn)生組件定義;
6. 如權(quán)利要求5所述的方法,其中,還包括 基于組件功能定義而產(chǎn)生應(yīng)用運(yùn)行時(shí)對(duì)象;以及 將該插件上下文對(duì)象與相應(yīng)的應(yīng)用運(yùn)行時(shí)對(duì)象相關(guān)聯(lián)。
7. 如權(quán)利要求1或6所述的方法,其中,所述方法還包括步驟 在運(yùn)行時(shí)根據(jù)該插件上下文對(duì)象而直接找到并調(diào)用該插件以實(shí)現(xiàn)該插件的功能。
8. 如權(quán)利要求1或6所述的方法,其中,所述插件上下文被形成 為鏈表的形式或樹(shù)狀結(jié)構(gòu)。
9. 如權(quán)利要求2或6所述的方法,其中,所述插件注冊(cè)表還包括 對(duì)插件之間的擴(kuò)展關(guān)系和/或依賴(lài)關(guān)系的定義,其中所述擴(kuò)展關(guān)系是指 在一個(gè)插件中還包括對(duì)指向另 一插件的擴(kuò)展點(diǎn)的定義,而所述依賴(lài)關(guān) 系是指 一 個(gè)插件的實(shí)例化依賴(lài)于另 一插件的實(shí)現(xiàn)。
10. —種與功能邏輯相分離地且可擴(kuò)展地實(shí)現(xiàn)非功能邏輯的設(shè)備, 包括應(yīng)用裝栽器,用于加栽應(yīng)用的策略需求配置;策略附加器,基于加載的策略需求配置獲得策略與所需的插件之 間的關(guān)聯(lián)關(guān)系,以及根據(jù)所獲得的關(guān)聯(lián)關(guān)系,產(chǎn)生插件上下文定義, 所述插件上下文定義是與該插件有關(guān)的插件上下文的一部分,其中所 述插件上下文定義了插件所提供的服務(wù)以及對(duì)與其有聯(lián)系的其它插件 的引用;和應(yīng)用構(gòu)造器,基于插件上下文定義而產(chǎn)生插件上下文對(duì)象,其中, 所述插件上下文對(duì)象是實(shí)例化的插件上下文定義。
11. 如權(quán)利要求10所述的設(shè)備,其中,所述設(shè)備還包括 插件注冊(cè)表單元,用于存儲(chǔ)包含插件的描述和插件之間的關(guān)系的信息的插件注冊(cè)表;其中,所述策略附加器基于策略需求配置查詢(xún)所迷插件注冊(cè)表而 獲得策略和所需的插件之間的關(guān)聯(lián)關(guān)系。
12. 如權(quán)利要求10所述的設(shè)備,其中,所述設(shè)備還包括 策略注冊(cè)表單元,用于存儲(chǔ)包含插件所支持的策略以及策略之間的關(guān)系的信息的策略注冊(cè)表;其中,所述策略附加器基于策略需求配置查詢(xún)策略注冊(cè)表,并基 于所述策略注冊(cè)表的查詢(xún)結(jié)果,進(jìn)一步通過(guò)查詢(xún)插件注冊(cè)表將所述策系,其中所述插件注冊(cè)表包含插件的描述和插件之間的關(guān)系的信息。
13. 如權(quán)利要求10至12中的任一個(gè)所述的設(shè)備,其中, 所述應(yīng)用裝載器還加載應(yīng)用的組件功能。
14. 如權(quán)利要求13所述的設(shè)備,其中,所述策略附加器還基于組件功能定義而產(chǎn)生應(yīng)用運(yùn)行時(shí)對(duì)象。
15. 如權(quán)利要求14所述的設(shè)備,其中,所述應(yīng)用構(gòu)造器將該插件上下文對(duì)象與相應(yīng)的應(yīng)用運(yùn)行時(shí)對(duì)象相 關(guān)聯(lián)。
16. 如權(quán)利要求10或14所述的設(shè)備,其中,所述設(shè)備還包括 應(yīng)用構(gòu)造子單元,用于在運(yùn)行時(shí)根據(jù)該插件上下文對(duì)象而直接找到并調(diào)用該插件以實(shí)現(xiàn)該插件的功能。
17. 如權(quán)利要求10或14所述的設(shè)備,其中,所述插件上下文被 形成為鏈表的形式或樹(shù)狀結(jié)構(gòu)。
18. 如權(quán)利要求11所述的設(shè)備,其中,所述插件注冊(cè)表還包括對(duì) 插件之間的擴(kuò)展關(guān)系和/或依賴(lài)關(guān)系的定義,其中所述擴(kuò)展關(guān)系是指在 一個(gè)插件中還包括對(duì)指向另 一插件的擴(kuò)展點(diǎn)的定義,而所述依賴(lài)關(guān)系 是指一個(gè)插件的實(shí)例化依賴(lài)于另一插件的實(shí)現(xiàn)。
19. 一種分離功能邏輯與非功能邏輯并實(shí)現(xiàn)非功能邏輯的系統(tǒng), 包括應(yīng)用層實(shí)體,用于供用戶(hù)實(shí)現(xiàn)功能邏輯并利用基礎(chǔ)架構(gòu)服務(wù)插件 層實(shí)體提供的插件;基礎(chǔ)架構(gòu)服務(wù)插件層實(shí)體,用于利用應(yīng)用運(yùn)行時(shí)層實(shí)體的服務(wù), 實(shí)現(xiàn)所述插件;以及應(yīng)用運(yùn)行時(shí)層實(shí)體,用于實(shí)現(xiàn)權(quán)利要求1至9所述的方法以供所 述基礎(chǔ)架構(gòu)服務(wù)插件層實(shí)體調(diào)用。
全文摘要
本發(fā)明提供了一種與功能邏輯相分離地且可擴(kuò)展地實(shí)現(xiàn)非功能邏輯的方法和設(shè)備及其系統(tǒng)和計(jì)算機(jī)程序產(chǎn)品,所述方法包括步驟基于加載的策略需求配置獲得策略與所需的插件之間的關(guān)聯(lián)關(guān)系;根據(jù)所獲得的關(guān)聯(lián)關(guān)系,產(chǎn)生插件上下文定義,所述插件上下文定義是與該插件有關(guān)的插件上下文的一部分,其中所述插件上下文定義了插件所提供的服務(wù)以及對(duì)與其有聯(lián)系的其它插件的引用;以及基于插件上下文定義而產(chǎn)生插件上下文對(duì)象,其中,所述插件上下文對(duì)象是實(shí)例化的插件上下文定義。根據(jù)本發(fā)明的方法使得能夠根據(jù)應(yīng)用配置對(duì)基礎(chǔ)架構(gòu)服務(wù)插件進(jìn)行隱式調(diào)用,避免了查詢(xún)插件注冊(cè)表并在插件調(diào)用期間獲得更好的性能。
文檔編號(hào)G06F9/44GK101387956SQ20071015369
公開(kāi)日2009年3月18日 申請(qǐng)日期2007年9月14日 優(yōu)先權(quán)日2007年9月14日
發(fā)明者劍 徐, 俊 朱, 談華芳, 黃鶴遠(yuǎn) 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司