AOP(Aspect-Oriented Programming) 面向切面編程
Aspect: 橫切面的功能,抽象出類或接口,AOP編程重要的就是識別出橫切面功能。(方面,類似于字符編碼功能)是advice和pointcut的結合。
Advice: 橫切面功能的具體實現,需要根據實際情況分析:
- 前置(Before): 在目標方法被調用之前調用advice。
- 后置(After): 在目標方法完成之后調用advice, 此時不關心方法的輸出是什么。
- 返回(After-returning): 在目標方法成功執行之后調用advice。
- 異常(After-throwing): 在目標方法拋出異常后調用advice。
- 環繞(Around):advice包裹了被advice的方法,在被advice的方法調用之前和調用之后執行自定義的行為。
Pointcut: 切入點,描述橫切面功能應用的限制,不是所有的流程都需要,有助于縮小切面所通知的連接點范圍。定義了“何處”。Pointcut的定義會匹配通知所要織入的一個或多個連接點。
Joinpoint: 連接點, 或指組件加入流程的時機, 比如設置屬性, 調用方法等。 Spring只支持方法調用的連接點, 而其他的一些框架支持屬性的連接點如:AspectJ,(類似于過濾器的過濾規則 request,forward)。這個點可以是調用方法時、拋出異常時、修改字段時。切面代碼可以利用這些點插入到應用的正常流程中,并添加新的行為。
Introduction:Introduction(引入)允許我們向現有的類添加新方法或屬性。
weaving: 織入,將組件應用到業務流程中的這個過程,叫縫合或織入(類似于將過濾器配置到web.xml文件的過程)。在目標生命周期有多個點可以進行織入:
- 編譯期:編譯時織入,需要特殊編譯器:AspectJ的織入編譯器就是這種方式織入切面的。
- 類加載期:在目標類加載到JVM時被織入。需要(ClassLoader)
- 運行期:在應用運行的某個時刻被織入。AOP容器會為目標對象動態地創建一個代理對象。SpringAOP就是以這種方式織入切面的。
Proxy: 代理,在實現上,Spring的AOP其實就是使用JDK的動態代理(使用接口的方式完成代理操作),也可以使用CGLIB(使用繼承的方式完成代理操作)。
Target: 業務操作的實際對象。
術語太多。我很難過。