專利名稱:構件化軟件中非功能特征組裝方法
技術領域:
本發(fā)明涉及一種軟件系統(tǒng)的組裝方法,尤其是一種構件化軟件系統(tǒng)的非功能特征組裝方法,屬于軟件技術領域。
背景技術:
在Internet成為主要的軟件運行平臺以及“軟件作為服務”的新型產品模式下,軟件系統(tǒng)的非功能特征顯得尤為重要,如安全、事務、可靠性等。對于通過一組預制構件(Component)組裝而成的應用系統(tǒng)而言,這些非功能特征往往涉及系統(tǒng)中的多個構件,同時,實現(xiàn)這些非功能特征的策略與機制大多特定于具體的應用。例如,一個構件在某應用中需要安全保護,某些關鍵操作還需要保證事務性,而在另一個應用中可能不需要安全保護,也不需要事務保障。因此,在構件制作階段就全面地考慮這些非功能特征不但難度大,而且也不必要。在構件制作階段就著手解決某些非功能特征,通常的做法是,將相關代碼硬編碼到構件實現(xiàn)體中,這樣雖然可以使構件實現(xiàn)了非功能特征,但是卻增加構件自身的復雜度,影響其性能和穩(wěn)定性,更嚴重的是,不論是否需要或好用,目標系統(tǒng)在復用這樣的構件時都需要遷就其硬編碼的非功能特征,導致該構件的可復用性大大降低。
側面(Aspect)用于描述系統(tǒng)中跨越多個構成成分的貫穿特性。這些特性既有功能性的,也有非功能性的,現(xiàn)有的側面技術主要致力于解決全新開發(fā)的系統(tǒng)中的非功能需求的問題,并且取得了較好的成效,但是,卻沒有考慮如何解決基于復用的系統(tǒng)組裝中的非功能需求的問題,而且,側面的復用率、目標系統(tǒng)的復用率較低,形成一定程度的資產浪費。
發(fā)明內容
本發(fā)明要解決的技術問題主要在于,針對現(xiàn)有技術中的構件化軟件中非功能特征組裝方法存在的構件可復用性低,側面的復用率、目標系統(tǒng)的復用率較低的問題,提出一種靈活、開放、簡單易行的方法,由構件提供主體功能特征,側面提供非功能特征,保證構件組裝而成的目標軟件系統(tǒng)滿足特定的非功能需求,側面與構件在設計、實現(xiàn)階段相互獨立,保證構件的可復用性,在系統(tǒng)運行階段,構件運行支撐平臺負責建立并維護構件與側面之間的關聯(lián),保證構件在運行過程中表現(xiàn)出指定的非功能特征。
本發(fā)明是通過如下的技術方案實現(xiàn)的一種構件化軟件中非功能特征組裝方法,包括如下步驟步驟一、建立包含側面的軟件體系結構,具體包括實現(xiàn)與構件相互獨立、提供非功能特征的側面;在體系結構建模階段建立側面與構件之間關聯(lián)的描述機制;步驟二、自動生成包含構件實現(xiàn)與側面實現(xiàn)的可運行代碼以及針對構件、側面、系統(tǒng)的部署描述符的軟件包;步驟三、在運行階段根據(jù)體系結構規(guī)約建立和調整構件實例與側面實例之間的關聯(lián)。
步驟一中實現(xiàn)與構件相互獨立、提供非功能特征的側面的具體步驟為定義側面激活時機及其與構件之間的交換數(shù)據(jù),以及側面可執(zhí)行的操作。
所述的激活時機包括構件實例創(chuàng)建前后、構件實例刪除前后、構件實例方法調用前后以及上述操作產生例外之后。
激活的側面可根據(jù)當前上下文執(zhí)行與非功能特征相應的動作,所述的當前上下文包括構件實例的狀態(tài)、標識以及方法調用請求的內容。
所述側面的實現(xiàn)語言由構件運行支撐平臺決定,當構件平臺為J2EE應用服務器時,側面可采用Java或C/C++實現(xiàn);當構件平臺為.NET時,側面可采用任何CLR(Common Language Runtime,通用語言運行環(huán)境)支持的編程語言,如C/C++,C#,Basic等。
步驟一中的描述機制為在體系結構建模時設定語言元素,分別為側面元素,用于描述側面實現(xiàn)提供的操作以及該操作可在哪些激活時刻執(zhí)行;插入點元素,用于描述某構件允許插入側面的具體操作;編織元素,其描述了在構件插入點插入的側面及該側面執(zhí)行的操作。
步驟二中的構件、側面、系統(tǒng)的部署描述符由體系結構建模語言書寫的設計文檔半自動化生成。
所述的步驟三中在運行階段構件實例與側面實例之間的關聯(lián)的建立過程為裝載并實例化指定的側面,然后建立與構件實例之間的關聯(lián)。所述的裝載是指構件運行支撐平臺解析部署描述符并讀取側面的可執(zhí)行代碼,實例化指的是構件運行支撐平臺創(chuàng)建側面實例并將之與指定的構件實例關聯(lián)起來。側面實例與構件實例之間的關聯(lián)采用截取器(Interceptor)模式實現(xiàn),即,與某個構件實例關聯(lián)的所有側面實例組成一個鏈路,安置在客戶端與構件實例之間,在構件實例調用前后、實例創(chuàng)建與實例刪除以及例外產生后被激活并執(zhí)行相應動作。
所述的步驟三中在運行階段構件實例與側面實例之間的關聯(lián)的調整具體包括增加側面,用于滿足新的非功能需求;當已有的非功能需求不再需要時刪除側面;當已有的非功能需求產生細微的變化時替換側面,當已有的非功能需求之間的優(yōu)先級別發(fā)生改變時調換側面實例的先后次序。
由于截取器模式中的截取器具有即插即用的能力,因此,側面實例及其與構件實例的關聯(lián)在運行時刻可以進行適度的調整。這種運行時調整的能力適合于非功能需求經常變化、尤其是需要保持7(天)×24(小時)不間斷運行的高可靠系統(tǒng)。
采用本發(fā)明的方法,同一個構件在不同應用中復用時,只要與不同的側面關聯(lián),就能滿足應用的非功能需求,極大提高軟件構件的可復用性;在保持當前系統(tǒng)持續(xù)運行、構件實例不受影響的前提下,可以在線調整非功能特征,這對于目前基于Web的大型軟件系統(tǒng)的開發(fā)、集成、演化具有十分重要的意義。另一方面,同一個側面可在同一個應用或不同應用中與多個構件關聯(lián)以實現(xiàn)非功能特征,這使側面也與構件一樣成為一種可復用的資產,增加了軟件復用在目標系統(tǒng)中的比重。
圖1為本發(fā)明所述的組裝方法流程圖;圖2為本發(fā)明一實施例的組裝示意圖。
具體實施例方式
以下結合附圖和具體實施例對本發(fā)明進行詳細說明。
一種構件化軟件中非功能特征組裝方法,如圖1,包括如下步驟步驟一、建立包含側面的軟件體系結構,具體包括實現(xiàn)與構件相互獨立、提供非功能特征的側面;在體系結構建模階段建立側面與構件之間關聯(lián)的描述機制;步驟二、自動生成包含構件實現(xiàn)與側面實現(xiàn)的可運行代碼以及針對構件、側面、系統(tǒng)的部署描述符的軟件包;步驟三、在運行階段根據(jù)體系結構規(guī)約建立和調整構件實例與側面實例之間的關聯(lián)。
具體說明如下由于側面可能與任意的構件關聯(lián),因此,側面的實現(xiàn)對構件的依賴必須降至最低。同時,側面的實現(xiàn)還必須便于運行時刻與構件建立關聯(lián),并在需要時在線增加、刪除或替換。典型的側面實現(xiàn)技術作用于編程語言,程序編譯之前側面與主體程序分離,編譯后則成為不可分割的整體。對構件組裝而言,采用這種實現(xiàn)方式的構件是一種硬編碼非功能特征的構件,具有難以復用的缺點。為此,本發(fā)明采用側面與構件在運行時才編織成一個整體的系統(tǒng)構造方式,確保構件的可復用性,兼顧普適性與實用性,本發(fā)明定義了側面激活時機及其與構件之間的交換數(shù)據(jù),以及側面可執(zhí)行的操作。側面可在構件實例創(chuàng)建前后、構件實例刪除前后、構件實例方法調用前后、以及上述操作產生例外之后被激活,激活的側面可根據(jù)當前上下文執(zhí)行與非功能特征相應的動作,典型的當前上下文包括構件實例的狀態(tài)、標識以及調用請求的內容,特別地,這些當前上下文就是側面與構件之間交換的數(shù)據(jù)。遵循這組規(guī)則的側面都可以在系統(tǒng)設計階段和運行階段建立與指定構件的關聯(lián),實現(xiàn)特定的非功能特征。側面采用的實現(xiàn)語言由構件運行支撐平臺決定,如構件平臺為J2EE應用服務器,則側面可采用Java或C/C++實現(xiàn),而構件平臺為.NET時,則可采用任何CLR支持的編程語言,如C/C++,C#,Basic等。
當實現(xiàn)了與構件相互獨立、提供非功能特征的側面之后,要在體系結構建模階段建立側面與構件之間的關聯(lián)。體系結構建模語言必須能夠描述符合上述實現(xiàn)方式的側面及其與構件的關聯(lián)。為此,本發(fā)明定義了三種新的語言元素,其中,側面元素描述了側面實現(xiàn)提供的操作以及這些操作可在哪些激活時刻執(zhí)行,如下列描述所示<aspect>
<aspectName>Security</aspectName>
<beforeInvocation><signature>accessControl</signature>
</beforeInvocation>
<beforeInvocation><signatute>authorize</signature>
</beforeInvocation>
……</aspect>
其中,側面元素由<aspect>標識,側面實現(xiàn)提供的操作由<signature>標識,激活時刻的表示如<beforeInvocation>,表示調用前激活側面。
插入點元素由實例名(ownerName)、扮演者名(playerName)、方法名(methodName)這樣的三元組組成,用以確定側面要影響到的具體某個方法,如下列描述所示<joinPoint>
<ownerName>shoppingCart</ownerName>
<playerName>ShoppingCart</playerName>
<methodName>getTaxes()</methodName>
</joinPoint>
其中,插入點元素由<joinPoint>標識,實例名由<ownerName>標識,扮演者名由<playerName>標識,方法名由<methodName>標識。
編織元素用于描述在構件插入點插入的側面及該側面執(zhí)行的操作,<weaving>
<beforeInvocation>
<refAspect>Security</refAspect>
<refMethod>accessControl</refMethod>
<property>
<Name>role-name</Name><value>administrator</value>
</property>
</beforeInvocation>
</weaving>
其中,編織元素由<weaving>標識;在構件插入點插入的側面由<refAspect>標識;執(zhí)行的操作由<refMethod>標識,<property>表示側面與構件之間交換的數(shù)據(jù)。
在體系結構建模階段建立了側面與構件之間關聯(lián)的描述后,體系結構建模工具可自動生成包含構件實現(xiàn)與側面實現(xiàn)的可運行代碼以及針對構件、側面、系統(tǒng)的部署描述符的軟件包。然后將軟件包部署到應用服務器,該服務器根據(jù)部署描述符裝載軟件包中的可運行代碼并實例化,在運行階段根據(jù)體系結構規(guī)約建立和調整構件實例與側面實例之間的關聯(lián)。
在軟件運行階段,構件運行支撐平臺解析部署描述符,讀取與側面元素、插入點元素、編織元素等信息相關的內容,裝載并實例化指定的側面實現(xiàn),然后建立與構件實例之間的關聯(lián)。針對前面提出的側面實現(xiàn)方式,側面實例與構件實例之間的關聯(lián)可以采用截取器(Interceptor)模式實現(xiàn),即,與某個構件實例關聯(lián)的所有側面實例組成一個鏈路,安置在客戶端與構件實例之間,在構件實例調用前后(實例創(chuàng)建與刪除也可視為特殊的調用)以及例外產生后被激活并執(zhí)行相應動作。
以下結合圖2,以基于ABC(Architecture Based Component Composition,基于軟件體系結構的構件組裝)方法的實現(xiàn)為例,對本發(fā)明的技術方案進行詳細的說明。
ABC方法將現(xiàn)有的軟件體系結構方法與基于構件的軟件開發(fā)方法結合在一起,把軟件體系結構作為系統(tǒng)藍圖而使用中間件技術作為系統(tǒng)運行的支撐平臺,并利用映射規(guī)則和工具來縮小設計到實現(xiàn)的距離。將側面引入ABC方法的具體工作包括在體系結構描述語言ABC/ADL中增加側面描述的語言元素,即側面元素、插入點元素、編織元素,在可視化體系結構建模工具中增加側面的表示,具體而言,就是將側面表示為一種特殊的構件,該構件的屬性包含側面元素中的所有內容;側面與構件之間的關聯(lián)表示為一種特殊的依賴,該依賴的屬性包括插入點元素與編織元素的內容。在特定于J2EE應用的軟件包自動生成工具中將側面描述寫入部署描述符,J2EE應用服務器支持截取器模式。引入側面之后的基于ABC的系統(tǒng)組裝過程具體如圖2所示,包括首先,根據(jù)系統(tǒng)功能需求從可復用資產庫中選擇J2EE構件,并通過連接子建立構件之間的交互關系,完成系統(tǒng)主體功能的設計;然后,根據(jù)非功能需求從可復用資產庫中選擇側面,如圖中的安全側面、事務側面,并在體系結構描述語言ABC/ADL中增加側面描述的語言元素,即側面元素、插入點元素、編織元素,建立其與構件之間的關聯(lián),從而完成系統(tǒng)非功能部分的設計;通過上述兩步完成了包含側面的軟件體系結構的設計。
接下來,根據(jù)上述的軟件體系結構自動生成特定于J2EE的應用軟件包,應用軟件包中包含了一個以上的構件以及一個應用部署描述符文件。其中,每一構件包含構件實現(xiàn)的可運行代碼以及一個構件部署描述符文件,構件部署描述符文件包括很多內容,諸如構件信息、依賴引用、資源引用、安全角色、事務屬性等;所有構件共用應用部署描述符文件中的應用系統(tǒng)配置信息,包括安全角色、名字服務、事務屬性、通信服務等。
最后,通過部署工具將軟件包安裝到J2EE應用服務器,該服務器將根據(jù)部署描述符裝載軟件包中的可運行代碼并實例化,其中,側面實現(xiàn)被實例化后以截取器的形式插入構件容器,并在指定時刻執(zhí)行非功能特性,所述的指定時刻為構件實例創(chuàng)建前后、構件實例刪除前后、構件實例方法調用前后、以及上述操作產生例外之后。例如,構件實例創(chuàng)建前,同類型構件實例總數(shù)已經達到上限,則不允許創(chuàng)建新的實例;構件實例刪除前,若實例總數(shù)達到下限,則不允許刪除該實例;構件實例方法調用前,往往需要激活多個截取器以協(xié)助構件調用公共服務從而實現(xiàn)非功能特征,如通信截取器調用通信服務實現(xiàn)構件的分布化訪問,日志截取器調用日志服務記錄構件的使用情況,認證截取器利用認證服務實現(xiàn)構件的安全訪問控制,而事務截取器則調用事務服務以保證構件的事務特性;上述方法調用產生例外時,可能需要執(zhí)行一些用戶定制的例外處理,如事務處理失敗需要回滾整個事務。
本實施例在運行時會根據(jù)具體的應用環(huán)境及應用要求調整側面,此時調整側面就是調整相應的截取器,如,為提高性能而禁用日志,只需從截取器鏈中刪除日志截取器即可;需要加密調用請求只需在通信截取器之前增加一個加密截取器;改變訪問構件所使用的互操作協(xié)議只需替換現(xiàn)有的通信截取器;調整構件的事務策略則改變事務截取器的屬性即可。
通過本方法實現(xiàn)的構件化軟件,其中的構件與側面相互獨立,構件與側面可以被不同的應用復用,提高了構件及側面的復用性;且當該目標軟件在運行時,可以根據(jù)需要調整非功能特征,使目標軟件的應用更加靈活,這對于目前基于Web的大型軟件系統(tǒng)的開發(fā)、集成、演化具有十分重要的意義。
最后所應說明的是,以上實施例僅用以說明本發(fā)明的技術方案而非限制,盡管參照較佳實施例對本發(fā)明進行了詳細說明,本領域的普通技術人員應當理解,可以對本發(fā)明的技術方案進行修改或者等同替換,而不脫離本發(fā)明技術方案的精神和范圍,其均應涵蓋在本發(fā)明的權利要求范圍當中。
權利要求
1.一種構件化軟件中非功能特征組裝方法,其特征在于包括如下步驟步驟一、建立包含側面的軟件體系結構,具體包括實現(xiàn)與構件相互獨立、提供非功能特征的側面;在體系結構建模階段建立側面與構件之間關聯(lián)的描述機制;步驟二、自動生成包含構件實現(xiàn)與側面實現(xiàn)的可運行代碼以及針對構件、側面、系統(tǒng)的部署描述符的軟件包;步驟三、在運行階段根據(jù)體系結構規(guī)約建立和調整構件實例與側面實例之間的關聯(lián)。
2.根據(jù)權利要求1所述的構件化軟件中非功能特征組裝方法,其特征在于所述的步驟一中實現(xiàn)與構件相互獨立、提供非功能特征的側面的具體步驟為定義側面激活時機及其與構件之間的交換數(shù)據(jù)以及側面可執(zhí)行的操作。
3.根據(jù)權利要求2所述的構件化軟件中非功能特征組裝方法,其特征在于所述的激活時機包括構件實例創(chuàng)建前后、構件實例刪除前后、構件實例方法調用前后以及上述操作產生例外之后。
4.根據(jù)權利要求2所述的構件化軟件中非功能特征組裝方法,其特征在于所述側面可執(zhí)行的操作為激活的側面根據(jù)當前上下文執(zhí)行與非功能特征相應的動作,所述的當前上下文包括構件實例的狀態(tài)、標識以及調用請求的內容。
5.根據(jù)權利要求1所述的構件化軟件中非功能特征組裝方法,其特征在于所述的描述機制為在體系結構建模時設定語言元素,其一為側面元素,用于描述側面實現(xiàn)提供的操作以及該操作可執(zhí)行的激活時刻;其二為插入點元素,用于描述構件允許插入側面的具體操作;其三為編織元素,用于描述在構件插入點插入的側面及該側面執(zhí)行的操作。
6.根據(jù)權利要求1或5所述的構件化軟件中非功能特征組裝方法,其特征在于所述的步驟二中的構件、側面、系統(tǒng)的部署描述符由體系結構建模語言書寫的設計文檔半自動化生成。
7.根據(jù)權利要求1所述的構件化軟件中非功能特征組裝方法,其特征在于所述的在運行階段建立構件實例與側面實例之間的關聯(lián)的步驟為裝載并實例化指定的側面,然后建立側面實例與構件實例之間的關聯(lián)。
8.根據(jù)權利要求7所述的構件化軟件中非功能特征組裝方法,其特征在于所述的實例與側面實例之間的關聯(lián)采用截取器模式,所述的截取器模式為,與某個構件實例關聯(lián)的所有側面實例組成一個鏈路,安置在客戶端與構件實例之間,在構件實例調用前后或實例創(chuàng)建或實例刪除以及例外產生后被激活并執(zhí)行相應動作。
9.根據(jù)權利要求1或7或8所述的構件化軟件中非功能特征組裝方法,其特征在于所述的步驟三中調整構件實例與側面實例之間的關聯(lián)包括增加側面、刪除側面、替換側面以及改變側面實例的先后次序。
全文摘要
本發(fā)明公開了一種構件化軟件中非功能特征組裝方法,包括建立包含側面的軟件體系結構,具體包括實現(xiàn)與構件相互獨立、提供非功能特征的側面,在體系結構建模階段建立側面與構件之間關聯(lián)的描述機制;自動生成包含構件實現(xiàn)與側面實現(xiàn)的可運行代碼以及針對構件、側面、系統(tǒng)的部署描述符的軟件包;在運行階段根據(jù)體系結構規(guī)約建立和調整構件實例與側面實例之間的關聯(lián);本發(fā)明有助于提高軟件構件的可復用性,可以在線調整非功能特征,對于目前大型軟件系統(tǒng)的開發(fā)、集成、演化具有十分重要的意義,另一方面,同一個側面可在同一個應用或不同應用中與多個構件關聯(lián)以實現(xiàn)非功能特征,這使得側面也成為一種可復用的資產,增加了軟件復用在目標系統(tǒng)中的比重。
文檔編號G06F9/44GK1584830SQ200410048128
公開日2005年2月23日 申請日期2004年6月16日 優(yōu)先權日2004年6月16日
發(fā)明者梅宏, 黃罡, 曹東剛, 王千祥 申請人:北京大學