a. 連接點(diǎn)(Joinpoint):程序執(zhí)行的某個(gè)特定位置(如:某個(gè)方法調(diào)用前、調(diào)用后贞铣,方法拋出異常后)闹啦。一個(gè)類(lèi)或一段程序代碼擁有一些具有邊界性質(zhì)的特定點(diǎn),這些代碼中的特定點(diǎn)就是連接點(diǎn)辕坝。Spring僅支持方法的連接點(diǎn)窍奋。
b. 切點(diǎn)(Pointcut):如果連接點(diǎn)相當(dāng)于數(shù)據(jù)中的記錄,那么切點(diǎn)相當(dāng)于查詢條件酱畅,一個(gè)切點(diǎn)可以匹配多個(gè)連接點(diǎn)琳袄。Spring AOP的規(guī)則解析引擎負(fù)責(zé)解析切點(diǎn)所設(shè)定的查詢條件,找到對(duì)應(yīng)的連接點(diǎn)纺酸。
c. 增強(qiáng)(Advice):增強(qiáng)是織入到目標(biāo)類(lèi)連接點(diǎn)上的一段程序代碼窖逗。Spring提供的增強(qiáng)接口都是帶方位名的,如:BeforeAdvice餐蔬、AfterReturningAdvice碎紊、ThrowsAdvice等。很多資料上將增強(qiáng)譯為“通知”用含,這明顯是個(gè)詞不達(dá)意的翻譯矮慕,讓很多程序員困惑了許久帮匾。
說(shuō)明: Advice在國(guó)內(nèi)的很多書(shū)面資料中都被翻譯成”通知”啄骇,但是很顯然這個(gè)翻譯無(wú)法表達(dá)其本質(zhì),有少量的讀物上將這個(gè)詞翻譯為”增強(qiáng)”瘟斜,這個(gè)翻譯是對(duì)Advice較為準(zhǔn)確的詮釋?zhuān)覀兺ㄟ^(guò)AOP將橫切關(guān)注功能加到原有的業(yè)務(wù)邏輯上缸夹,這就是對(duì)原有業(yè)務(wù)邏輯的一種增強(qiáng),這種增強(qiáng)可以是前置增強(qiáng)螺句、后置增強(qiáng)虽惭、返回后增強(qiáng)、拋異常時(shí)增強(qiáng)和包圍型增強(qiáng)蛇尚。
d. 引介(Introduction):引介是一種特殊的增強(qiáng)芽唇,它為類(lèi)添加一些屬性和方法。這樣取劫,即使一個(gè)業(yè)務(wù)類(lèi)原本沒(méi)有實(shí)現(xiàn)某個(gè)接口匆笤,通過(guò)引介功能,可以動(dòng)態(tài)的未該業(yè)務(wù)類(lèi)添加接口的實(shí)現(xiàn)邏輯谱邪,讓業(yè)務(wù)類(lèi)成為這個(gè)接口的實(shí)現(xiàn)類(lèi)炮捧。
e. 織入(Weaving):織入是將增強(qiáng)添加到目標(biāo)類(lèi)具體連接點(diǎn)上的過(guò)程,AOP有三種織入方式:①編譯期織入:需要特殊的Java編譯期(例如AspectJ的ajc)惦银;②裝載期織入:要求使用特殊的類(lèi)加載器咆课,在裝載類(lèi)的時(shí)候?qū)︻?lèi)進(jìn)行增強(qiáng)末誓;③運(yùn)行時(shí)織入:在運(yùn)行時(shí)為目標(biāo)類(lèi)生成代理實(shí)現(xiàn)增強(qiáng)。Spring采用了動(dòng)態(tài)代理的方式實(shí)現(xiàn)了運(yùn)行時(shí)織入书蚪,而AspectJ采用了編譯期織入和裝載期織入的方式喇澡。
f. 切面(Aspect):切面是由切點(diǎn)和增強(qiáng)(引介)組成的,它包括了對(duì)橫切關(guān)注功能的定義殊校,也包括了對(duì)連接點(diǎn)的定義撩幽。