AOP(Aspect-Oriented Programming) 面向切面編程
Aspect: 橫切面的功能,抽象出類或接口,AOP編程重要的就是識別出橫切面功能。(方面,類似于字符編碼功能)是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的定義會匹配通知所要織入的一個(gè)或多個(gè)連接點(diǎn)。
Joinpoint: 連接點(diǎn), 或指組件加入流程的時(shí)機(jī), 比如設(shè)置屬性, 調(diào)用方法等。 Spring只支持方法調(diào)用的連接點(diǎn), 而其他的一些框架支持屬性的連接點(diǎn)如:AspectJ,(類似于過濾器的過濾規(guī)則 request,forward)。這個(gè)點(diǎn)可以是調(diào)用方法時(shí)、拋出異常時(shí)、修改字段時(shí)。切面代碼可以利用這些點(diǎn)插入到應(yīng)用的正常流程中,并添加新的行為。
Introduction:Introduction(引入)允許我們向現(xiàn)有的類添加新方法或?qū)傩浴?/p>
weaving: 織入,將組件應(yīng)用到業(yè)務(wù)流程中的這個(gè)過程,叫縫合或織入(類似于將過濾器配置到web.xml文件的過程)。在目標(biāo)生命周期有多個(gè)點(diǎn)可以進(jìn)行織入:
- 編譯期:編譯時(shí)織入,需要特殊編譯器:AspectJ的織入編譯器就是這種方式織入切面的。
- 類加載期:在目標(biāo)類加載到JVM時(shí)被織入。需要(ClassLoader)
- 運(yùn)行期:在應(yīng)用運(yùn)行的某個(gè)時(shí)刻被織入。AOP容器會為目標(biāo)對象動(dòng)態(tài)地創(chuàng)建一個(gè)代理對象。SpringAOP就是以這種方式織入切面的。
Proxy: 代理,在實(shí)現(xiàn)上,Spring的AOP其實(shí)就是使用JDK的動(dòng)態(tài)代理(使用接口的方式完成代理操作),也可以使用CGLIB(使用繼承的方式完成代理操作)。
Target: 業(yè)務(wù)操作的實(shí)際對象。
術(shù)語太多。我很難過。