版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1面向方面的程序設(shè)計(jì)面向方面的程序設(shè)計(jì)兼談?dòng)?jì)算科學(xué)的創(chuàng)新兼談?dòng)?jì)算科學(xué)的創(chuàng)新2面向方面的程序設(shè)計(jì)面向方面的程序設(shè)計(jì)nAspect oriented programming(AOP)3n Xerox(施樂(lè)施樂(lè))公司公司PARC研究中心在研究中心在19971997年的歐洲年的歐洲面向?qū)ο缶幊檀髸?huì)(面向?qū)ο缶幊檀髸?huì)(ECOOP97ECOOP97)上首次提出)上首次提出Aspect-Aspect-oriented programmingoriented programming(AOPAOP)。n 自自20022002年起,每年分別在歐洲和美國(guó)輪流召開(kāi)專(zhuān)門(mén)年起,每年分別在歐洲和美國(guó)輪流召開(kāi)專(zhuān)門(mén)的面向方面軟
2、件開(kāi)發(fā)(的面向方面軟件開(kāi)發(fā)(AOSDAOSD)國(guó)際會(huì)議。與會(huì)者包括)國(guó)際會(huì)議。與會(huì)者包括美國(guó)、加拿大、荷蘭、英國(guó)、法國(guó)、丹麥、日本、以美國(guó)、加拿大、荷蘭、英國(guó)、法國(guó)、丹麥、日本、以色列等。我國(guó)一些學(xué)校也對(duì)色列等。我國(guó)一些學(xué)校也對(duì)AOPAOP給以關(guān)注并開(kāi)展了一些給以關(guān)注并開(kāi)展了一些研究工作。研究工作。n 從從AOP概念提出經(jīng)過(guò)了近十年的時(shí)間,這種技術(shù)概念提出經(jīng)過(guò)了近十年的時(shí)間,這種技術(shù)現(xiàn)在已經(jīng)開(kāi)始被工業(yè)界采用?,F(xiàn)在已經(jīng)開(kāi)始被工業(yè)界采用。 4AOPAOP產(chǎn)生的背景產(chǎn)生的背景 計(jì)算機(jī)軟件設(shè)計(jì)的一個(gè)重要原則,就是要清計(jì)算機(jī)軟件設(shè)計(jì)的一個(gè)重要原則,就是要清晰晰分離各種關(guān)注點(diǎn)分離各種關(guān)注點(diǎn)(separat
3、ion of concerns),然),然后分而治之,各個(gè)擊破,最后形成統(tǒng)一的解決方案。后分而治之,各個(gè)擊破,最后形成統(tǒng)一的解決方案。業(yè)務(wù)邏輯存儲(chǔ)日志安全需求關(guān)注點(diǎn)標(biāo)識(shí)5 關(guān)注點(diǎn):是指一個(gè)特定的目標(biāo)、概念或者興趣域。關(guān)注點(diǎn):是指一個(gè)特定的目標(biāo)、概念或者興趣域。n從技術(shù)的角度,軟件系統(tǒng)分別包括從技術(shù)的角度,軟件系統(tǒng)分別包括核心級(jí)和系統(tǒng)級(jí)核心級(jí)和系統(tǒng)級(jí)的關(guān)的關(guān)注點(diǎn)。注點(diǎn)。n核心級(jí)關(guān)注點(diǎn)是系統(tǒng)要完成的核心級(jí)關(guān)注點(diǎn)是系統(tǒng)要完成的業(yè)務(wù)功能業(yè)務(wù)功能;n系統(tǒng)級(jí)關(guān)注點(diǎn)是完成核心級(jí)關(guān)注點(diǎn)所必須的系統(tǒng)級(jí)關(guān)注點(diǎn)是完成核心級(jí)關(guān)注點(diǎn)所必須的配套設(shè)施配套設(shè)施,這,這些配套設(shè)施通常被認(rèn)為是整個(gè)系統(tǒng)的系統(tǒng)特性,或者是業(yè)些配套
4、設(shè)施通常被認(rèn)為是整個(gè)系統(tǒng)的系統(tǒng)特性,或者是業(yè)務(wù)功能的功能約束。務(wù)功能的功能約束。例如:信用卡處理系統(tǒng)例如:信用卡處理系統(tǒng) 核心關(guān)注點(diǎn)是核心關(guān)注點(diǎn)是處理付款處理付款; 系統(tǒng)級(jí)關(guān)注點(diǎn)包括系統(tǒng)級(jí)關(guān)注點(diǎn)包括日志、事務(wù)、認(rèn)證、安全和性日志、事務(wù)、認(rèn)證、安全和性能能等等。等等。6n軟件系統(tǒng)中,某個(gè)行為,例如操作日志的軟件系統(tǒng)中,某個(gè)行為,例如操作日志的記錄,存在于軟件的各個(gè)部分中,這個(gè)行記錄,存在于軟件的各個(gè)部分中,這個(gè)行為可以看作是橫向存在于軟件之中,他所為可以看作是橫向存在于軟件之中,他所關(guān)注的是軟件的各個(gè)部分的一些共有的行關(guān)注的是軟件的各個(gè)部分的一些共有的行為。為。n在很多情況下,這種行為不屬于業(yè)務(wù)
5、邏輯在很多情況下,這種行為不屬于業(yè)務(wù)邏輯的一部分。這種操作并不是業(yè)務(wù)邏輯調(diào)用的一部分。這種操作并不是業(yè)務(wù)邏輯調(diào)用的必須部分,但是,我們卻往往不得在代的必須部分,但是,我們卻往往不得在代碼中顯式進(jìn)行調(diào)用,并承擔(dān)由此帶來(lái)的后碼中顯式進(jìn)行調(diào)用,并承擔(dān)由此帶來(lái)的后果。果。7n在目前的技術(shù)框架下,通常在目前的技術(shù)框架下,通常系統(tǒng)級(jí)關(guān)注點(diǎn)在系統(tǒng)級(jí)關(guān)注點(diǎn)在邏輯上邏輯上相互之相互之間間彼此正交(相互獨(dú)立),彼此正交(相互獨(dú)立),同時(shí)在同時(shí)在實(shí)現(xiàn)上實(shí)現(xiàn)上趨向于趨向于和若干核和若干核心模塊交織心模塊交織。 例如:信用卡管理系統(tǒng)的每個(gè)核心業(yè)務(wù)關(guān)注點(diǎn)都和安全、例如:信用卡管理系統(tǒng)的每個(gè)核心業(yè)務(wù)關(guān)注點(diǎn)都和安全、日志等系
6、統(tǒng)關(guān)注點(diǎn)相聯(lián)系。日志等系統(tǒng)關(guān)注點(diǎn)相聯(lián)系。8n核心級(jí)關(guān)注點(diǎn)核心級(jí)關(guān)注點(diǎn)(業(yè)務(wù))多數(shù)情況下可以(業(yè)務(wù))多數(shù)情況下可以被很好地分解,并被很好地分解,并通過(guò)編程語(yǔ)言模塊化通過(guò)編程語(yǔ)言模塊化實(shí)現(xiàn)(子模塊或軟構(gòu)件)實(shí)現(xiàn)(子模塊或軟構(gòu)件)。n系統(tǒng)級(jí)關(guān)注點(diǎn)系統(tǒng)級(jí)關(guān)注點(diǎn)(橫向關(guān)注點(diǎn)),使用當(dāng)(橫向關(guān)注點(diǎn)),使用當(dāng)前的程序設(shè)計(jì)方法導(dǎo)致前的程序設(shè)計(jì)方法導(dǎo)致在許多構(gòu)件中要在許多構(gòu)件中要重復(fù)包含(擴(kuò)散)這些代碼重復(fù)包含(擴(kuò)散)這些代碼。9橫切示例(crosscutting)nAuthentication 權(quán)限權(quán)限nCaching 緩存緩存nContext passing 內(nèi)容傳遞內(nèi)容傳遞nError handling
7、錯(cuò)誤處理錯(cuò)誤處理nLazy loading 懶加載懶加載nDebugging 調(diào)試調(diào)試nLogging、tracing、profiling and monitoring 日志、跟蹤、日志、跟蹤、優(yōu)化、校準(zhǔn)優(yōu)化、校準(zhǔn)nPerformance optimization 性能優(yōu)化性能優(yōu)化nPersistence 持久化持久化nResource pooling 資源池資源池nSynchronization 同步同步nTransactions 事務(wù)事務(wù)10現(xiàn)有軟件技術(shù)的不足 目前的實(shí)現(xiàn)技術(shù)只提供了一維方法學(xué)實(shí)現(xiàn)系統(tǒng)的關(guān)注點(diǎn),該單一維度一般是核心需求和關(guān)注點(diǎn)的模塊化實(shí)現(xiàn),其他類(lèi)型的需求也被迫和該主導(dǎo)維度一
8、致。安安全全事事務(wù)務(wù)業(yè)業(yè)務(wù)務(wù)業(yè)務(wù)主導(dǎo)維業(yè)務(wù)主導(dǎo)維 問(wèn)題空間是問(wèn)題空間是n n維的,而解空間是一維的。這種失配必然導(dǎo)致需求和維的,而解空間是一維的。這種失配必然導(dǎo)致需求和實(shí)現(xiàn)之間的失配。實(shí)現(xiàn)之間的失配。11源程序就會(huì)變成一些為不同關(guān)注目的而編制的源程序就會(huì)變成一些為不同關(guān)注目的而編制的指令的纏結(jié)混亂物。指令的纏結(jié)混亂物。纏結(jié)現(xiàn)象纏結(jié)現(xiàn)象是現(xiàn)有軟件系統(tǒng)中許多不必要的是現(xiàn)有軟件系統(tǒng)中許多不必要的復(fù)雜性的核心復(fù)雜性的核心。它增加了功能構(gòu)件之間的依賴(lài)性,它增加了功能構(gòu)件之間的依賴(lài)性,分散了構(gòu)件原來(lái)假定要做的事情,分散了構(gòu)件原來(lái)假定要做的事情,提供了許多程序設(shè)計(jì)出錯(cuò)的機(jī)會(huì),提供了許多程序設(shè)計(jì)出錯(cuò)的機(jī)會(huì),使
9、得一些功能構(gòu)件難以復(fù)用,使得一些功能構(gòu)件難以復(fù)用,源代碼難以開(kāi)發(fā)、理解和發(fā)展。源代碼難以開(kāi)發(fā)、理解和發(fā)展。12v某一應(yīng)用的領(lǐng)域?qū)<?,不太可能?duì)分布、認(rèn)證、某一應(yīng)用的領(lǐng)域?qū)<遥惶赡軐?duì)分布、認(rèn)證、訪(fǎng)問(wèn)控制、同步、加密、冗余等問(wèn)題的復(fù)雜實(shí)訪(fǎng)問(wèn)控制、同步、加密、冗余等問(wèn)題的復(fù)雜實(shí)現(xiàn)機(jī)制很熟悉,所以就不能保證他們?cè)诔绦蛑鞋F(xiàn)機(jī)制很熟悉,所以就不能保證他們?cè)诔绦蛑羞M(jìn)行正確的調(diào)用。進(jìn)行正確的調(diào)用。v開(kāi)發(fā)人員很難正確預(yù)見(jiàn)到未來(lái)對(duì)程序的新需求開(kāi)發(fā)人員很難正確預(yù)見(jiàn)到未來(lái)對(duì)程序的新需求。13方面(Aspect)n設(shè)計(jì)上講,是橫切系統(tǒng)的一些軟件系統(tǒng)級(jí)關(guān)注點(diǎn)。設(shè)計(jì)上講,是橫切系統(tǒng)的一些軟件系統(tǒng)級(jí)關(guān)注點(diǎn)。n實(shí)現(xiàn)上講,它
10、支持將橫切系統(tǒng)的關(guān)注點(diǎn)封裝在單獨(dú)的模塊單實(shí)現(xiàn)上講,它支持將橫切系統(tǒng)的關(guān)注點(diǎn)封裝在單獨(dú)的模塊單位中,它是位中,它是AOP將橫切關(guān)注點(diǎn)局部化和模塊化的實(shí)現(xiàn)機(jī)制。將橫切關(guān)注點(diǎn)局部化和模塊化的實(shí)現(xiàn)機(jī)制。n常見(jiàn)的常見(jiàn)的“方面方面”:異常和出錯(cuò)處理異常和出錯(cuò)處理同步和并發(fā)控制同步和并發(fā)控制 內(nèi)存訪(fǎng)問(wèn)模式內(nèi)存訪(fǎng)問(wèn)模式日志、安全日志、安全事務(wù)、性能事務(wù)、性能14 AOP AOP核心內(nèi)容就是所謂的核心內(nèi)容就是所謂的“橫切關(guān)注點(diǎn)橫切關(guān)注點(diǎn)”,即,即“方面方面”,AspectAspect是是AOPAOP提供的一種程序設(shè)計(jì)單元。提供的一種程序設(shè)計(jì)單元。而在而在OOP中中,這些一般關(guān)注點(diǎn)的實(shí)現(xiàn)單元叫作類(lèi)這些一般關(guān)注點(diǎn)的
11、實(shí)現(xiàn)單元叫作類(lèi) AOPAOP的目標(biāo),是要將這些橫切關(guān)注點(diǎn)與業(yè)務(wù)邏的目標(biāo),是要將這些橫切關(guān)注點(diǎn)與業(yè)務(wù)邏輯代碼相分離,從而得到更好的軟件結(jié)構(gòu)、性能以輯代碼相分離,從而得到更好的軟件結(jié)構(gòu)、性能以及穩(wěn)定性等方面的好處。及穩(wěn)定性等方面的好處。 AOPAOP被認(rèn)為是后面向?qū)ο髸r(shí)代的一種新的重要被認(rèn)為是后面向?qū)ο髸r(shí)代的一種新的重要的程序設(shè)計(jì)技術(shù)。的程序設(shè)計(jì)技術(shù)。15AOP的基本思想n通過(guò)分別描述系統(tǒng)的不同關(guān)注點(diǎn)及其關(guān)系,以一種松耦合的方通過(guò)分別描述系統(tǒng)的不同關(guān)注點(diǎn)及其關(guān)系,以一種松耦合的方式實(shí)現(xiàn)單個(gè)關(guān)注點(diǎn),然后依靠式實(shí)現(xiàn)單個(gè)關(guān)注點(diǎn),然后依靠AOP環(huán)境的支撐機(jī)制,將這些關(guān)環(huán)境的支撐機(jī)制,將這些關(guān)注點(diǎn)組織或編排
12、成最終的可運(yùn)行程序。注點(diǎn)組織或編排成最終的可運(yùn)行程序。 普通關(guān)注點(diǎn)可以使用傳統(tǒng)的結(jié)構(gòu)化方法和面向?qū)ο蠓椒w統(tǒng)的機(jī)普通關(guān)注點(diǎn)可以使用傳統(tǒng)的結(jié)構(gòu)化方法和面向?qū)ο蠓椒w統(tǒng)的機(jī)制。制。 系統(tǒng)關(guān)注點(diǎn)使用系統(tǒng)關(guān)注點(diǎn)使用Aspect機(jī)制。機(jī)制。16AOP程序設(shè)計(jì)的一般步驟n一、一、對(duì)需求規(guī)約進(jìn)行對(duì)需求規(guī)約進(jìn)行Aspect分解。分解。n確定哪些功能是組件必須實(shí)現(xiàn)的,即提取出確定哪些功能是組件必須實(shí)現(xiàn)的,即提取出核心核心關(guān)注點(diǎn)。關(guān)注點(diǎn)。n哪些功能可以以哪些功能可以以aspect的形式動(dòng)態(tài)加入到系統(tǒng)組的形式動(dòng)態(tài)加入到系統(tǒng)組件中去,即提取出系統(tǒng)級(jí)的件中去,即提取出系統(tǒng)級(jí)的橫切關(guān)注點(diǎn)橫切關(guān)注點(diǎn)。17AOP程序設(shè)計(jì)的一
13、般步驟n二、二、對(duì)標(biāo)識(shí)出的對(duì)標(biāo)識(shí)出的Aspect分別通過(guò)程序機(jī)制實(shí)現(xiàn)。分別通過(guò)程序機(jī)制實(shí)現(xiàn)。 構(gòu)造系統(tǒng)的組件。構(gòu)造系統(tǒng)的組件。 利用利用組件語(yǔ)言組件語(yǔ)言實(shí)現(xiàn)系統(tǒng)的組件。對(duì)于實(shí)現(xiàn)系統(tǒng)的組件。對(duì)于OOP語(yǔ)言,這些組件可以是語(yǔ)言,這些組件可以是類(lèi);對(duì)于過(guò)程化程序設(shè)計(jì)語(yǔ)言,這些組件可以是各種函數(shù)和類(lèi);對(duì)于過(guò)程化程序設(shè)計(jì)語(yǔ)言,這些組件可以是各種函數(shù)和API。 構(gòu)造系統(tǒng)的構(gòu)造系統(tǒng)的aspect。 利用一種或多種利用一種或多種aspect語(yǔ)言語(yǔ)言實(shí)現(xiàn)實(shí)現(xiàn)aspect。 aspect語(yǔ)言必須提供聲明語(yǔ)言必須提供聲明aspect的機(jī)制。的機(jī)制。aspect如何聲明如何聲明連接點(diǎn)如何定義連接點(diǎn)如何定義aspect
14、代碼如何定義代碼如何定義aspect的參數(shù)化程度等的參數(shù)化程度等18n三、三、用用aspect編織器將所有的單元編排重組在一起,形成最終的可運(yùn)行編織器將所有的單元編排重組在一起,形成最終的可運(yùn)行系統(tǒng)。系統(tǒng)。 為組件語(yǔ)言和為組件語(yǔ)言和aspect語(yǔ)言構(gòu)造相應(yīng)的語(yǔ)法樹(shù);依據(jù)語(yǔ)言構(gòu)造相應(yīng)的語(yǔ)法樹(shù);依據(jù)aspect中的連接點(diǎn)中的連接點(diǎn)定義對(duì)語(yǔ)法樹(shù)進(jìn)行聯(lián)結(jié);在連接的語(yǔ)法樹(shù)上生成中間文件或目標(biāo)代碼。定義對(duì)語(yǔ)法樹(shù)進(jìn)行聯(lián)結(jié);在連接的語(yǔ)法樹(shù)上生成中間文件或目標(biāo)代碼。 aspect語(yǔ)言必須提供將語(yǔ)言必須提供將aspect代碼和基礎(chǔ)代碼組合編排(代碼和基礎(chǔ)代碼組合編排(weaving)在一起的機(jī)制。在一起的機(jī)制。定
15、義編排語(yǔ)言和規(guī)則。定義編排語(yǔ)言和規(guī)則。解決解決aspect之間潛在的沖突。之間潛在的沖突。為組裝和執(zhí)行建立外部約束。為組裝和執(zhí)行建立外部約束。 aspect語(yǔ)言必須提供生成可運(yùn)行系統(tǒng)的實(shí)現(xiàn)機(jī)制。語(yǔ)言必須提供生成可運(yùn)行系統(tǒng)的實(shí)現(xiàn)機(jī)制。系統(tǒng)的組合是在編譯時(shí)靜態(tài)組裝還是運(yùn)行時(shí)動(dòng)態(tài)進(jìn)行。系統(tǒng)的組合是在編譯時(shí)靜態(tài)組裝還是運(yùn)行時(shí)動(dòng)態(tài)進(jìn)行。對(duì)程序單元分別進(jìn)行編譯的模塊化編譯機(jī)制。對(duì)程序單元分別進(jìn)行編譯的模塊化編譯機(jī)制。對(duì)組裝結(jié)果的驗(yàn)證機(jī)制等。對(duì)組裝結(jié)果的驗(yàn)證機(jī)制等。19AOP的本質(zhì)n 將橫切關(guān)注點(diǎn)(如日志、權(quán)限驗(yàn)證、并發(fā)控制等非功能需將橫切關(guān)注點(diǎn)(如日志、權(quán)限驗(yàn)證、并發(fā)控制等非功能需求)單獨(dú)用求)單獨(dú)用as
16、pect實(shí)現(xiàn),而業(yè)務(wù)功能用現(xiàn)有的軟件技術(shù)實(shí)實(shí)現(xiàn),而業(yè)務(wù)功能用現(xiàn)有的軟件技術(shù)實(shí)現(xiàn)。由現(xiàn)。由AOP機(jī)制提供將這些分離的關(guān)注點(diǎn)編織為一個(gè)可執(zhí)行機(jī)制提供將這些分離的關(guān)注點(diǎn)編織為一個(gè)可執(zhí)行程序。程序。n提高代碼的可理解性、可維護(hù)性、可復(fù)用性等。提高代碼的可理解性、可維護(hù)性、可復(fù)用性等。橫切關(guān)注點(diǎn)橫切關(guān)注點(diǎn)20AOP系統(tǒng)的軟件開(kāi)發(fā)過(guò)程業(yè)務(wù)邏輯存儲(chǔ)日志安全需求關(guān)注點(diǎn)標(biāo)識(shí)編織器Aspect分解Aspect重組21AOP與OOP比較OOP是是AOP的技術(shù)基礎(chǔ),的技術(shù)基礎(chǔ),AOP是對(duì)是對(duì)OOP的繼承和發(fā)的繼承和發(fā)展。展。n可擴(kuò)展性:可擴(kuò)展性: 指軟件系統(tǒng)在需求更改時(shí)程序的易更改能力。指軟件系統(tǒng)在需求更改時(shí)程序的易
17、更改能力。 OOP主要通過(guò)提供繼承和重載機(jī)制來(lái)提高軟件的主要通過(guò)提供繼承和重載機(jī)制來(lái)提高軟件的可擴(kuò)展性??蓴U(kuò)展性。 AOP通過(guò)擴(kuò)展通過(guò)擴(kuò)展Aspect或增加或增加Aspect,系統(tǒng)相關(guān)的,系統(tǒng)相關(guān)的各個(gè)部分都隨之產(chǎn)生變化。各個(gè)部分都隨之產(chǎn)生變化。22n可重用性:可重用性: 指某個(gè)應(yīng)用系統(tǒng)中的元素被應(yīng)用到其他應(yīng)用系統(tǒng)的能指某個(gè)應(yīng)用系統(tǒng)中的元素被應(yīng)用到其他應(yīng)用系統(tǒng)的能力。力。 OOP以類(lèi)機(jī)制作為一種抽象的數(shù)據(jù)類(lèi)型,提供了比過(guò)以類(lèi)機(jī)制作為一種抽象的數(shù)據(jù)類(lèi)型,提供了比過(guò)程化更好的重用性。程化更好的重用性。nOOP的重用性對(duì)非特定于系統(tǒng)的功能模塊有很好的支持,的重用性對(duì)非特定于系統(tǒng)的功能模塊有很好的支持
18、,如堆棧的操作和窗口機(jī)制的實(shí)現(xiàn)。如堆棧的操作和窗口機(jī)制的實(shí)現(xiàn)。n對(duì)于不能封裝成類(lèi)的元素,如異常處理等,很難實(shí)現(xiàn)重對(duì)于不能封裝成類(lèi)的元素,如異常處理等,很難實(shí)現(xiàn)重用。用。AOP使不能封裝成類(lèi)的元素的重用成為可能。使不能封裝成類(lèi)的元素的重用成為可能。23n易理解性和易維護(hù)性易理解性和易維護(hù)性n代碼纏結(jié)問(wèn)題的存在,使代碼纏結(jié)問(wèn)題的存在,使OOP技術(shù)在易理解性和易維護(hù)技術(shù)在易理解性和易維護(hù)性方面都難有很大的提高。性方面都難有很大的提高。n統(tǒng)計(jì)發(fā)現(xiàn):統(tǒng)計(jì)發(fā)現(xiàn):“如果一個(gè)他人寫(xiě)的程序有如果一個(gè)他人寫(xiě)的程序有37處需要改動(dòng),處需要改動(dòng),對(duì)于一個(gè)最優(yōu)秀的軟件開(kāi)發(fā)人員,也大概只能找到對(duì)于一個(gè)最優(yōu)秀的軟件開(kāi)發(fā)人員
19、,也大概只能找到35個(gè)個(gè)”。n對(duì)于對(duì)于AOP,對(duì)一個(gè),對(duì)一個(gè)Aspect修改可以通過(guò)聯(lián)結(jié)器影響到修改可以通過(guò)聯(lián)結(jié)器影響到系統(tǒng)相關(guān)的各個(gè)部分,從而大大提高系統(tǒng)的易維護(hù)性。系統(tǒng)相關(guān)的各個(gè)部分,從而大大提高系統(tǒng)的易維護(hù)性。24AOP特性nAspect的實(shí)現(xiàn)和傳統(tǒng)開(kāi)發(fā)方法中的實(shí)現(xiàn)和傳統(tǒng)開(kāi)發(fā)方法中模塊的實(shí)現(xiàn)不同模塊的實(shí)現(xiàn)不同。 Aspect的開(kāi)發(fā)彼此獨(dú)立,是一種松耦合關(guān)系。的開(kāi)發(fā)彼此獨(dú)立,是一種松耦合關(guān)系。 主代碼的開(kāi)發(fā)者甚至可能沒(méi)有意識(shí)到主代碼的開(kāi)發(fā)者甚至可能沒(méi)有意識(shí)到aspect的存在。的存在。只是在最后系統(tǒng)組裝時(shí),才將各只是在最后系統(tǒng)組裝時(shí),才將各aspect代碼和主代碼代碼和主代碼編排融合在一起
20、。編排融合在一起。主代碼和主代碼和AspectAspect之間采用之間采用“隱式調(diào)用隱式調(diào)用”。v 某一應(yīng)用的領(lǐng)域?qū)<?,不太可能?duì)分布、認(rèn)證、訪(fǎng)問(wèn)控制、同步、某一應(yīng)用的領(lǐng)域?qū)<?,不太可能?duì)分布、認(rèn)證、訪(fǎng)問(wèn)控制、同步、加密、冗余等問(wèn)題的復(fù)雜實(shí)現(xiàn)機(jī)制很熟悉,所以就不能保證他們加密、冗余等問(wèn)題的復(fù)雜實(shí)現(xiàn)機(jī)制很熟悉,所以就不能保證他們?cè)诔绦蛑羞M(jìn)行正確的調(diào)用。在程序中進(jìn)行正確的調(diào)用。v 開(kāi)發(fā)人員很難正確預(yù)見(jiàn)到未來(lái)對(duì)程序的新需求。開(kāi)發(fā)人員很難正確預(yù)見(jiàn)到未來(lái)對(duì)程序的新需求。25AspectJnAspectJ是是Xerox PARC開(kāi)發(fā)的基于開(kāi)發(fā)的基于Java語(yǔ)言語(yǔ)言的的AOP擴(kuò)展,它既是一種規(guī)約語(yǔ)言,也是一
21、擴(kuò)展,它既是一種規(guī)約語(yǔ)言,也是一種種AOP的實(shí)現(xiàn)語(yǔ)言。的實(shí)現(xiàn)語(yǔ)言。nAspectJ是一種支持是一種支持“面向面向Aspect”概念的語(yǔ)言。概念的語(yǔ)言。26AspectJnAspectJ提供了支持提供了支持“面向面向Aspect”概念的如下語(yǔ)言結(jié)構(gòu)及定概念的如下語(yǔ)言結(jié)構(gòu)及定義:義: Joinpoints:預(yù)定義好的程序的特定執(zhí)行點(diǎn)。:預(yù)定義好的程序的特定執(zhí)行點(diǎn)。例如:例如: 方法的調(diào)用和執(zhí)行方法的調(diào)用和執(zhí)行 對(duì)屬性的讀寫(xiě)訪(fǎng)問(wèn)對(duì)屬性的讀寫(xiě)訪(fǎng)問(wèn) 異常處理異常處理 對(duì)象和類(lèi)的初始化執(zhí)行對(duì)象和類(lèi)的初始化執(zhí)行 構(gòu)造器的調(diào)用和執(zhí)行構(gòu)造器的調(diào)用和執(zhí)行27 Pointcuts:用來(lái)指明所需連接點(diǎn)的語(yǔ)言元素用來(lái)指
22、明所需連接點(diǎn)的語(yǔ)言元素??赡馨ㄒ幌悼赡馨ㄒ幌盗械倪B接點(diǎn)列的連接點(diǎn),同時(shí)它還可以為在連接點(diǎn)上執(zhí)行的通知提供上同時(shí)它還可以為在連接點(diǎn)上執(zhí)行的通知提供上下文下文。例如:例如: pointcut callSetter( ); call (public void HelloWorld.set*(.)。 其中:其中: pointcut說(shuō)明聲明的是一個(gè)切入點(diǎn),命名說(shuō)明聲明的是一個(gè)切入點(diǎn),命名 callSetter,后面的,后面的空括號(hào)表示該切入點(diǎn)不需要上下文信息??绽ㄌ?hào)表示該切入點(diǎn)不需要上下文信息。 Call表示該切入點(diǎn)捕獲的是對(duì)指定方法的調(diào)用,指定的方法是表示該切入點(diǎn)捕獲的是對(duì)指定方法的調(diào)用,指定的方
23、法是在類(lèi)在類(lèi)HelloWorld中聲明的共有的、返回值為空、以中聲明的共有的、返回值為空、以set開(kāi)頭、開(kāi)頭、擁有任意參數(shù)的方法。擁有任意參數(shù)的方法。28 Advices:要在:要在Pointcuts執(zhí)行的執(zhí)行的Aspect的代碼。的代碼。 AspectJ提供了提供了3種把通知關(guān)聯(lián)到連接點(diǎn)的方式:種把通知關(guān)聯(lián)到連接點(diǎn)的方式:after、before、around。 after和和before分別表示通知在連接分別表示通知在連接點(diǎn)的前面或者后面運(yùn)行,點(diǎn)的前面或者后面運(yùn)行,around則表示通知在連接點(diǎn)則表示通知在連接點(diǎn)的外面運(yùn)行,并可以決定是否運(yùn)行此連接點(diǎn)。的外面運(yùn)行,并可以決定是否運(yùn)行此連接點(diǎn)
24、。 例如:例如: 在銀行信息系統(tǒng)中,實(shí)現(xiàn)帳戶(hù)存取模塊、權(quán)限驗(yàn)證模在銀行信息系統(tǒng)中,實(shí)現(xiàn)帳戶(hù)存取模塊、權(quán)限驗(yàn)證模塊和日志記錄模塊。帳戶(hù)存取模塊可用塊和日志記錄模塊。帳戶(hù)存取模塊可用OOP技術(shù)來(lái)實(shí)技術(shù)來(lái)實(shí)現(xiàn),其他的模塊可采用現(xiàn),其他的模塊可采用AOP技術(shù)。技術(shù)。 在在around通知中驗(yàn)證權(quán)限,只有驗(yàn)證通過(guò)才運(yùn)行該連通知中驗(yàn)證權(quán)限,只有驗(yàn)證通過(guò)才運(yùn)行該連接點(diǎn),在接點(diǎn),在before和和after通知中就輸出日志記錄。通知中就輸出日志記錄。 Aspect:上述三者的結(jié)合。以類(lèi)似于類(lèi)的概念,將:上述三者的結(jié)合。以類(lèi)似于類(lèi)的概念,將Pointcut和和Advice組合在一起,形成一個(gè)程序單元。組合在一起
25、,形成一個(gè)程序單元。29nAspectJ為程序員提供了編譯、調(diào)試等工具。為程序員提供了編譯、調(diào)試等工具。nAspect編排器編排器n將不同將不同aspect組裝到一起。組裝到一起。nAspect調(diào)試器調(diào)試器n獨(dú)立的獨(dú)立的Aspect瀏覽器瀏覽器n和一些流行的和一些流行的IDE環(huán)境(環(huán)境( Forte 、 Jbuilder 、 Emacs )的集成。)的集成。nAspectJ可以引入新的數(shù)據(jù)成員和新的方法??梢砸胄碌臄?shù)據(jù)成員和新的方法。30應(yīng)用示例應(yīng)用示例1:1:一個(gè)簡(jiǎn)單的使用面向?qū)ο蠓椒ㄔO(shè)計(jì)的圖元編輯器的示例。在該圖元編輯器在該圖元編輯器中,抽象圖元類(lèi)中,抽象圖元類(lèi)FigureElement
26、有有兩個(gè)圖元子類(lèi)兩個(gè)圖元子類(lèi)Point和和Line,分,分別對(duì)點(diǎn)和線(xiàn)進(jìn)行別對(duì)點(diǎn)和線(xiàn)進(jìn)行管理。這兩個(gè)類(lèi)管理。這兩個(gè)類(lèi)體現(xiàn)了良好的模體現(xiàn)了良好的模塊性,類(lèi)中源代塊性,類(lèi)中源代碼都緊密相關(guān),碼都緊密相關(guān),內(nèi)聚度很高,并內(nèi)聚度很高,并且每個(gè)類(lèi)的接口且每個(gè)類(lèi)的接口都很清晰都很清晰。顯示更新的需求:顯示更新的需求:無(wú)論圖元何時(shí)移動(dòng)、無(wú)論圖元何時(shí)移動(dòng)、移動(dòng)到哪里,都要移動(dòng)到哪里,都要通知屏幕管理器通知屏幕管理器(Display)其位)其位置發(fā)生了改變。置發(fā)生了改變。31 采用面向?qū)ο蟮脑O(shè)計(jì)方法,典型的做法是在每個(gè)移動(dòng)圖采用面向?qū)ο蟮脑O(shè)計(jì)方法,典型的做法是在每個(gè)移動(dòng)圖元的操作代碼中,都插入一段通知元的操作代碼
27、中,都插入一段通知Display其位置發(fā)生了改變其位置發(fā)生了改變的代碼(調(diào)用的代碼(調(diào)用Display.update( )方法),如圖所示。方法),如圖所示。Class Line private Point _p1,_p2; Point getP1( ) return _p1; Point getP2( ) return _p2; void setP1(Point p1)this._p1=p1; Display.update( ); void setP2(Point p2)this._p2=p2; Display.update( ); Class Point private int _x1,_
28、x2; int getX( ) return _x1; int getY( ) return _x2; void setX (int x1)this._x1=x1; Display.update( ); void setY(int x2)this._x2=x2; Display.update( ); 32Aspect DisplayUpdatingPointcut move(): call(void Line.setP1(Point)| call(void Line.setP2(Point)| call(void Point.setX(int)| call(void Point.setY(in
29、t); after() returning:move()Display.update(); Class Line private Point _p1,_p2; Point getP1( ) return _p1; Point getP2( ) return _p2; void setP1(Point p1)this._p1=p1; void setP2(Point p2)this._p2=p2; Class Point private int _x1,_x2; int getX( ) return _x1; int getY( ) return _x2; void setX (int x1)t
30、his._x1=x1; void setY(int x2)this._x2=x2; 33假設(shè)我們想用假設(shè)我們想用aspect做以下的事情:做以下的事情:n在任何對(duì)象調(diào)用在任何對(duì)象調(diào)用TestClass.sayHello()方法的前后打印一條消方法的前后打印一條消息。息。n測(cè)試測(cè)試TestClass.sayAnyThing()方法的參數(shù)至少有三個(gè)字符。方法的參數(shù)至少有三個(gè)字符。public class TestClasspublic void sayHello()System.out.println(“Hello,AOP”);public void SayAnyThing(String s)sy
31、stem.out.println(s);)public static void main(String args)TestClass t=newTestClass();t.sayHello();t.sayAnyThing(“ok”); 應(yīng)用234public aspect MyAspectpublic pointcut sayMethodCall(): call(public void TestClass.say*();pub1ic pointcut sayMethodCal1Arg(String str): call(public void TestClass.sayAnyThing (st
32、ring)&args(str);before():sayMethodCal1() System.out.print1n(“nTestClass.”+ thisJoinPointStaticPart.getSignature().getName()+”start”);after():sayMethodCal1() System.out.print1n(“nTestClass.”+ thisJoinPointStaticPart.getSignature().getName()+”end”);before(String str):sayMethodCallArg(str) if(str.1engt
33、h() 3) System.out.println(“Error:I cant say words less than 3 characters”); return; 35應(yīng)用示例應(yīng)用示例3 3:例外處理:例外處理 以數(shù)據(jù)庫(kù)查詢(xún)?yōu)槔謩e用以數(shù)據(jù)庫(kù)查詢(xún)?yōu)槔?,分別用OOP的的Java語(yǔ)言語(yǔ)言和和AOPAOP的的AspectJAspectJ語(yǔ)言加以語(yǔ)言加以 實(shí)現(xiàn)。實(shí)現(xiàn)。public class DBQuery public ResultSet executeQuery(String sql)try/ 數(shù)據(jù)庫(kù)連接操作數(shù)據(jù)庫(kù)連接操作/ 數(shù)據(jù)庫(kù)查詢(xún)操作數(shù)據(jù)庫(kù)查詢(xún)操作catch(java.lang.Cla
34、ssNotFoundException e)/對(duì)對(duì)ClassNotFound 例外進(jìn)行處理例外進(jìn)行處理catch(SQLException e)/ 對(duì)對(duì)SQL例外進(jìn)行處理例外進(jìn)行處理catch(Exception e)/ 對(duì)其他例外進(jìn)行處理對(duì)其他例外進(jìn)行處理36分析以上代碼,主要存在以下幾點(diǎn)不足:分析以上代碼,主要存在以下幾點(diǎn)不足:n要求編程人員掌握大量的例外類(lèi)庫(kù)和復(fù)雜的語(yǔ)法結(jié)構(gòu),要求編程人員掌握大量的例外類(lèi)庫(kù)和復(fù)雜的語(yǔ)法結(jié)構(gòu),實(shí)際應(yīng)用中容易出錯(cuò);實(shí)際應(yīng)用中容易出錯(cuò);n對(duì)例外的處理并不是對(duì)例外的處理并不是DBQuery類(lèi)的核心功能,但編程類(lèi)的核心功能,但編程人員要花費(fèi)大量精力在例外的處理上,而
35、忽略了問(wèn)題人員要花費(fèi)大量精力在例外的處理上,而忽略了問(wèn)題本身;本身;n當(dāng)當(dāng)DBQuery所在類(lèi)包中定義了多個(gè)類(lèi)或所在類(lèi)包中定義了多個(gè)類(lèi)或DBQuery中中定義了多個(gè)方法時(shí)定義了多個(gè)方法時(shí)( (如數(shù)據(jù)庫(kù)記錄的添加、更新、刪除如數(shù)據(jù)庫(kù)記錄的添加、更新、刪除等操作),就要重復(fù)定義多個(gè)相同的例外處理;等操作),就要重復(fù)定義多個(gè)相同的例外處理;n大量的例外處理代碼可能引起更多的不必要錯(cuò)誤,給大量的例外處理代碼可能引起更多的不必要錯(cuò)誤,給程序調(diào)試和維護(hù)帶來(lái)了困難;程序調(diào)試和維護(hù)帶來(lái)了困難;基于以上幾點(diǎn),可認(rèn)為它是有安全隱患和不健壯的程序。基于以上幾點(diǎn),可認(rèn)為它是有安全隱患和不健壯的程序。37 基于基于AO
36、P 安全編程的思想,在安全編程的思想,在DBQuery類(lèi)類(lèi)中保留單純的數(shù)據(jù)庫(kù)連接和查詢(xún)代碼,而將其中保留單純的數(shù)據(jù)庫(kù)連接和查詢(xún)代碼,而將其中實(shí)現(xiàn)例外處理的代碼抽取出來(lái),組織成單獨(dú)中實(shí)現(xiàn)例外處理的代碼抽取出來(lái),組織成單獨(dú)模塊。模塊。 38aspect ExHandledeclare soft: Exception : within(DBQuery);pointcut Callmethod(DBQuery query):this(query)& call(* * DBQuery.*(.) ;after (DBQuery query) throwing (java.lang.ClassNotFoun
37、dException e): Callmethod(query) /對(duì)對(duì)ClassNotFound 例外進(jìn)行處理例外進(jìn)行處理after (DBQuery query) throwing (SQLException e ): Callmethod(query) /對(duì)對(duì)SQL例外進(jìn)行處理例外進(jìn)行處理 after (DBQuery query) throwing (Exception e ): Callmethod(query) /對(duì)其它對(duì)其它例外進(jìn)行處理例外進(jìn)行處理39 以下幾方面為突出的安全優(yōu)點(diǎn):以下幾方面為突出的安全優(yōu)點(diǎn):n程序開(kāi)發(fā)人員可專(zhuān)注于數(shù)據(jù)庫(kù)連接和查詢(xún)操作本身,程序開(kāi)發(fā)人員可專(zhuān)注于數(shù)據(jù)
38、庫(kù)連接和查詢(xún)操作本身,而無(wú)須同時(shí)考慮對(duì)例外的處理;而無(wú)須同時(shí)考慮對(duì)例外的處理;n安全代碼被獨(dú)立到單獨(dú)的安全代碼被獨(dú)立到單獨(dú)的aspect 中,使程序更易理解,中,使程序更易理解,且當(dāng)安全策略需要修改時(shí),只需變動(dòng)且當(dāng)安全策略需要修改時(shí),只需變動(dòng)ExHandle 代碼,代碼,而無(wú)需改動(dòng)而無(wú)需改動(dòng)DBQuery 類(lèi);類(lèi);n當(dāng)添加新的類(lèi)或當(dāng)添加新的類(lèi)或DBQuery類(lèi)中添加新的方法時(shí),編程類(lèi)中添加新的方法時(shí),編程人員不必考慮新的錯(cuò)誤處理策略,甚至不必去了解這人員不必考慮新的錯(cuò)誤處理策略,甚至不必去了解這些策略,些策略, ExHandle代碼將自動(dòng)應(yīng)用于它們。代碼將自動(dòng)應(yīng)用于它們。40應(yīng)用應(yīng)用4 4:一
39、個(gè)異常處理的實(shí)例:一個(gè)異常處理的實(shí)例 下面的代碼是一個(gè)簡(jiǎn)單的方面的例子,它打印所下面的代碼是一個(gè)簡(jiǎn)單的方面的例子,它打印所有的沒(méi)有被包中定義的任何方法處理的異常。我們能有的沒(méi)有被包中定義的任何方法處理的異常。我們能在測(cè)試時(shí)使用這個(gè)代碼,看是否有沒(méi)預(yù)料到的錯(cuò)誤,在測(cè)試時(shí)使用這個(gè)代碼,看是否有沒(méi)預(yù)料到的錯(cuò)誤,由此指出包中的一個(gè)漏洞。由此指出包中的一個(gè)漏洞。public aspect ExceptionPrinterpointcut allMethods( ):executions(* *();static after( ) throwing (Exception e):allMethods( )S
40、ystem.out.println(“Uncaught exception:”+ e);41應(yīng)用5:AOP技術(shù)在并發(fā)訪(fǎng)問(wèn)控制中的應(yīng)用n當(dāng)多個(gè)線(xiàn)程要訪(fǎng)問(wèn)同一個(gè)變量或?qū)ο髸r(shí),為了保證數(shù)當(dāng)多個(gè)線(xiàn)程要訪(fǎng)問(wèn)同一個(gè)變量或?qū)ο髸r(shí),為了保證數(shù)據(jù)的一致性,要實(shí)施一些并發(fā)訪(fǎng)問(wèn)控制策略。據(jù)的一致性,要實(shí)施一些并發(fā)訪(fǎng)問(wèn)控制策略。n通常的做法是采用加鎖和解鎖的方法。即多個(gè)訪(fǎng)問(wèn)類(lèi)通常的做法是采用加鎖和解鎖的方法。即多個(gè)訪(fǎng)問(wèn)類(lèi)同時(shí)訪(fǎng)問(wèn)一個(gè)共享數(shù)據(jù)對(duì)象時(shí),每個(gè)訪(fǎng)問(wèn)類(lèi)在訪(fǎng)問(wèn)這同時(shí)訪(fǎng)問(wèn)一個(gè)共享數(shù)據(jù)對(duì)象時(shí),每個(gè)訪(fǎng)問(wèn)類(lèi)在訪(fǎng)問(wèn)這個(gè)數(shù)據(jù)對(duì)象時(shí),將數(shù)據(jù)對(duì)象上鎖,訪(fǎng)問(wèn)完成后,再解個(gè)數(shù)據(jù)對(duì)象時(shí),將數(shù)據(jù)對(duì)象上鎖,訪(fǎng)問(wèn)完成后,再解鎖,供其他并發(fā)線(xiàn)
41、程訪(fǎng)問(wèn)。鎖,供其他并發(fā)線(xiàn)程訪(fǎng)問(wèn)。workerAnotherworker數(shù)據(jù)對(duì)象數(shù)據(jù)對(duì)象上鎖上鎖解鎖解鎖上鎖上鎖解鎖解鎖42public aspect LockReentrantWriterPreferenceReadWriteLock rwl = new ReentrantWriterPreferenceReadWriteLock();public pointcut writeOperations( ): execution(public boolean Worker.createData( )| execution(public boolean Worker.updateData( ) |
42、execution(public boolean AnotherWorker.updateData( );before( ): writeOperations( )rwl.writeLock( ).acquire( );/在寫(xiě)操作之前上鎖在寫(xiě)操作之前上鎖after( ): writeOperations( )rwl.writeLock( ).release( );/在寫(xiě)操作之后解鎖在寫(xiě)操作之后解鎖43AOPAOP研究?jī)?nèi)容研究?jī)?nèi)容nEarly aspects: aspect-oriented requirements engineering and architecture design.nAs
43、pect-oriented modeling and designnDesign patterns for aspect-oriented systemsn 44nAspect-oriented programming languages, platforms and frameworksnType systems for aspectsnComposition models and operators for aspectsnOptimization and performance improvement of aspect-oriented composition45nApplicatio
44、n of AOSD in specific areas such as embedded systems, banking systems, ambient computing, etc.nAspects in feature-oriented approaches and product lines.nAspects in reengineering46小結(jié)小結(jié)nAOP起源于程序設(shè)計(jì)中起源于程序設(shè)計(jì)中“橫切橫切”引發(fā)的引發(fā)的“代碼散布代碼散布”和和“代碼交織代碼交織”問(wèn)題。在目前的程序設(shè)計(jì)技術(shù)下,程問(wèn)題。在目前的程序設(shè)計(jì)技術(shù)下,程序中的橫切無(wú)法避免,其實(shí)現(xiàn)代碼相互糾纏在一起,序中的橫切無(wú)法避免,其實(shí)現(xiàn)代碼相互糾纏在一起,是軟件復(fù)雜度的來(lái)源之一。是軟件復(fù)雜度的來(lái)源之一。nAOP就是要能分離出那些隱含的、相互交織糾纏的系就是要能分離出那些隱含的、相互交織糾纏的系統(tǒng)關(guān)注點(diǎn),并使之明確。使用統(tǒng)關(guān)注點(diǎn)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中小企業(yè)合作發(fā)展合同協(xié)議書(shū)
- 個(gè)人與公司無(wú)償借款合同模板
- 個(gè)人房屋買(mǎi)賣(mài)合同范文大全
- 不動(dòng)產(chǎn)權(quán)益轉(zhuǎn)讓合同書(shū)范文
- 三人合作經(jīng)營(yíng)合同書(shū)
- 業(yè)務(wù)外包合同模板大全
- 個(gè)人借款抵押擔(dān)保合同范本
- 個(gè)人業(yè)務(wù)合作合同協(xié)議
- 個(gè)人借款車(chē)輛抵押合同范本
- 專(zhuān)業(yè)版工程合同還款計(jì)劃書(shū)樣本
- 2025年中國(guó)南方航空股份有限公司招聘筆試參考題庫(kù)含答案解析
- 商務(wù)部發(fā)布《中國(guó)再生資源回收行業(yè)發(fā)展報(bào)告(2024)》
- 山東省濟(jì)南市2024-2024學(xué)年高三上學(xué)期1月期末考試 地理 含答案
- 2025年福建新華發(fā)行(集團(tuán))限責(zé)任公司校園招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 實(shí)施彈性退休制度暫行辦法解讀課件
- 江蘇省駕??荚嚳颇恳豢荚囶}庫(kù)
- 四川省成都市青羊區(qū)成都市石室聯(lián)合中學(xué)2023-2024學(xué)年七上期末數(shù)學(xué)試題(解析版)
- 2024-2030年中國(guó)自動(dòng)光學(xué)檢測(cè)儀(AOI)市場(chǎng)競(jìng)爭(zhēng)格局與前景發(fā)展策略分析報(bào)告
- 咨詢(xún)公司績(jī)效工資分配實(shí)施方案
- 2025新人教版英語(yǔ)七年級(jí)下單詞表
- 中華護(hù)理學(xué)會(huì)團(tuán)體標(biāo)準(zhǔn)-氣管切開(kāi)非機(jī)械通氣患者氣道護(hù)理
評(píng)論
0/150
提交評(píng)論