AOP(Aspect-Oriented Programming) 面向切面編程
Aspect: 橫切面的功能谱煤,抽象出類(lèi)或接口禽拔,AOP編程重要的就是識(shí)別出橫切面功能。(方面睹栖,類(lèi)似于字符編碼功能)是advice和pointcut的結(jié)合野来。
Advice: 橫切面功能的具體實(shí)現(xiàn),需要根據(jù)實(shí)際情況分析:
- 前置(Before): 在目標(biāo)方法被調(diào)用之前調(diào)用advice曼氛。
- 后置(After): 在目標(biāo)方法完成之后調(diào)用advice舀患, 此時(shí)不關(guān)心方法的輸出是什么。
- 返回(After-returning): 在目標(biāo)方法成功執(zhí)行之后調(diào)用advice聊浅。
- 異常(After-throwing): 在目標(biāo)方法拋出異常后調(diào)用advice。
- 環(huán)繞(Around):advice包裹了被advice的方法,在被advice的方法調(diào)用之前和調(diào)用之后執(zhí)行自定義的行為努咐。
Pointcut: 切入點(diǎn)殴胧,描述橫切面功能應(yīng)用的限制佩迟,不是所有的流程都需要竿屹,有助于縮小切面所通知的連接點(diǎn)范圍。定義了“何處”秉溉。Pointcut的定義會(huì)匹配通知所要織入的一個(gè)或多個(gè)連接點(diǎn)碗誉。
Joinpoint: 連接點(diǎn), 或指組件加入流程的時(shí)機(jī)弄跌, 比如設(shè)置屬性尝苇, 調(diào)用方法等。 Spring只支持方法調(diào)用的連接點(diǎn)糠溜, 而其他的一些框架支持屬性的連接點(diǎn)如:AspectJ,(類(lèi)似于過(guò)濾器的過(guò)濾規(guī)則 request诵冒,forward)。這個(gè)點(diǎn)可以是調(diào)用方法時(shí)汽馋、拋出異常時(shí)豹芯、修改字段時(shí)。切面代碼可以利用這些點(diǎn)插入到應(yīng)用的正常流程中铁蹈,并添加新的行為握牧。
Introduction:Introduction(引入)允許我們向現(xiàn)有的類(lèi)添加新方法或?qū)傩浴?/p>
weaving: 織入,將組件應(yīng)用到業(yè)務(wù)流程中的這個(gè)過(guò)程沿腰,叫縫合或織入(類(lèi)似于將過(guò)濾器配置到web.xml文件的過(guò)程)。在目標(biāo)生命周期有多個(gè)點(diǎn)可以進(jìn)行織入:
- 編譯期:編譯時(shí)織入习蓬,需要特殊編譯器:AspectJ的織入編譯器就是這種方式織入切面的。
- 類(lèi)加載期:在目標(biāo)類(lèi)加載到JVM時(shí)被織入芦缰。需要(ClassLoader)
- 運(yùn)行期:在應(yīng)用運(yùn)行的某個(gè)時(shí)刻被織入枫慷。AOP容器會(huì)為目標(biāo)對(duì)象動(dòng)態(tài)地創(chuàng)建一個(gè)代理對(duì)象。SpringAOP就是以這種方式織入切面的涕俗。
Proxy: 代理神帅,在實(shí)現(xiàn)上,Spring的AOP其實(shí)就是使用JDK的動(dòng)態(tài)代理(使用接口的方式完成代理操作)元镀,也可以使用CGLIB(使用繼承的方式完成代理操作)霎桅。
Target: 業(yè)務(wù)操作的實(shí)際對(duì)象。
術(shù)語(yǔ)太多滔驶。我很難過(guò)揭糕。