1. 程式人生 > 實用技巧 >AOP 面向切面程式設計

AOP 面向切面程式設計

AOP 概述

面向切面程式設計(AOP)和麵向物件程式設計(OOP)類似,也是一種程式設計模式。Spring AOP 是基於 AOP 程式設計模式的一個框架,它的使用有效減少了系統間的重複程式碼,達到了模組間的鬆耦合目的。

AOP 的全稱是“Aspect Oriented Programming”,即面向切面程式設計,它將業務邏輯的各個部分進行隔離,使開發人員在編寫業務邏輯時可以專心於核心業務,從而提高了開發效率。

AOP 採取橫向抽取機制,取代了傳統縱向繼承體系的重複性程式碼,其應用主要體現在事務處理、日誌管理、許可權控制、異常處理等方面。

目前最流行的 AOP 框架有兩個,分別為 Spring AOP 和 AspectJ。

Spring AOP 使用純 Java 實現,不需要專門的編譯過程和類載入器,在執行期間通過代理方式向目標類植入增強的程式碼。

AspectJ 是一個基於 Java 語言的 AOP 框架,從 Spring 2.0 開始,Spring AOP 引入了對 AspectJ 的支援。AspectJ 擴充套件了 Java 語言,提供了一個專門的編譯器,在編譯時提供橫向程式碼的植入。

為了更好地理解 AOP,就需要對 AOP 的相關術語有一些瞭解,這些專業術語主要包含 Joinpoint、Pointcut、Advice、Target、Weaving、Proxy 和 Aspect,它們的含義如下表所示。
在這裡插入圖片描述

JDK 動態代理

當 Spring 沒有手動開啟 Cglib 動態代理,即:<aop:aspectj-autoproxy proxy-target-class="true"/>@EnableAspectJAutoProxy(proxyTargetClass = true),預設使用的就是Jdk動態代理。

動態代理的應用範圍很廣,例如:日誌、事務管理、快取等。需要注意的是,Jdk動態代理相比起cglib動態代理,Jdk動態代理的物件必須實現介面,否則將報錯。

CGLIB 動態代理

通過教程的學習可以知道,JDK 動態代理使用起來非常簡單,但是它也有一定的侷限性,這是因為 JDK 動態代理必須要實現一個或多個介面,如果不希望實現介面,則可以使用 CGLIB 代理。

CGLIB(Code Generation Library)是一個高效能開源的程式碼生成包,它被許多 AOP 框架所使用,其底層是通過使用一個小而快的位元組碼處理框架 ASM(Java 位元組碼操控框架)轉換位元組碼並生成新的類。

Spring 通知型別和建立 AOP 代理

Spring 通知型別

通知(Advice)其實就是對目標切入點進行增強的內容,Spring AOP 為通知(Advice)提供了 org.aopalliance.aop.Advice 介面。
在這裡插入圖片描述

宣告式 Spring AOP

Spring 使用 org.springframework.aop.framework.ProxyFactoryBean 建立一個 AOP 代理,這個類對應的切入點和通知提供了完整的控制能力,並可以生成指定的內容。
在這裡插入圖片描述

使用 AspectJ 開發 AOP

AspectJ 是一個基於 Java 語言的 AOP 框架,它擴充套件了 Java 語言。Spring 2.0 以後,新增了對 AspectJ 方式的支援,新版本的 Spring 框架,建議使用 AspectJ 方式開發 AOP。

基於 XML 的宣告式

基於 XML 的宣告式是指通過 Spring 配置檔案的方式定義切面、切入點及宣告通知,而所有的切面和通知都必須定義在 <aop:config> 元素中。

基於 Annotation 的宣告式

在 Spring 中,儘管使用 XML 配置檔案可以實現 AOP 開發,但是如果所有的相關的配置都集中在配置檔案中,勢必會導致 XML 配置檔案過於臃腫,從而給維護和升級帶來一定的困難。

為此,AspectJ 框架為 AOP 開發提供了另一種開發方式——基於 Annotation 的宣告式。AspectJ 允許使用註解定義切面、切入點和增強處理,而 Spring 框架則可以識別並根據這些註解生成 AOP 代理。
在這裡插入圖片描述