對Spring Aop的理解和應用場景

2022-09-13 21:51:25 字數 2376 閱讀 3815

aop(aspect-orientedprogramming,面向切面程式設計),可以說是oop(object-oriented programing,物件導向程式設計)的補充和完善。oop引入封裝、繼承和多型性等概念來建立一種物件層次結構,用以模擬公共行為的乙個集合。當我們需要為分散的物件引入公共行為的時候,oop則顯得無能為力。也就是說,oop允許你定義從上到下的關係,但並不適合定義從左到右的關係。例如日誌功能。日誌**往往水平地散布在所有物件層次中,而與它所散布到的物件的核心功能毫無關係。對於其他型別的**,如安全性、異常處理和透明的持續性也是如此。這種散布在各處的無關的**被稱為橫切(cross-cutting)**,在oop設計中,它導致了大量**的重複,而不利於各個模組的重用。

而aop技術則恰恰相反,它利用一種稱為「橫切」的技術,剖解開封裝的物件內部,並將那些影響了多個類的公共行為封裝到乙個可重用模組,並將其名為「aspect」,即方面。所謂「方面」,簡單地說,就是將那些與業務無關,卻為業務模組所共同呼叫的邏輯或責任封裝起來,便於減少系統的重複**,降低模組間的耦合度,並有利於未來的可操作性和可維護性。aop代表的是乙個橫向的關係,如果說「物件」是乙個空心的圓柱體,其中封裝的是物件的屬性和行為;那麼面向方面程式設計的方法,就彷彿一把利刃,將這些空心圓柱體剖開,以獲得其內部的訊息。而剖開的切面,也就是所謂的「方面」了。然後它又以巧奪天功的妙手將這些剖開的切面復原,不留痕跡。

使用「橫切」技術,aop把軟體系統分為兩個部分:核心關注點和橫切關注點。業務處理的主要流程是核心關注點,與之關係不大的部分是橫切關注點。橫切關注點的乙個特點是,他們經常發生在核心關注點的多處,而各處都基本相似。比如許可權認證、日誌、事務處理。aop 的作用在於分離系統中的各種關注點,將核心關注點和橫切關注點分離開來。正如**anade公司的高階方案構架師adam magee所說,aop的核心思想就是「將應用程式中的商業邏輯同對其提供支援的通用服務進行分離。」

實現aop的技術,主要分為兩大類:一是採用動態**技術,利用擷取訊息的方式,對該訊息進行裝飾,以取代原有物件行為的執行;二是採用靜態織入的方式,引入特定的語法建立「方面」,從而使得編譯器可以在編譯期間織入有關「方面」的**。

我們經常會用到的有如下幾種

1、基於**的aop

2、純簡單j**a

物件切面

3、@aspect註解形式的

4、注入形式的aspcet切面

開發步驟:

i. 建立原始物件

ii. 新增額外功能(advice、methodinterceptor)

iii. 切入點(pointcut)

iv. 組裝切面

場景一:aop與事務

使用基於註解的aop事務管理 

探索tx:annotation-driven標籤: 

標籤是註解驅動的事務管理支援的核心。 

標籤的屬性: 

transaction-manager:指定到現有的platformtransactionmanager bean的引用,通知會使用該引用。default="transactionmanager" 

mode:指定spring事務管理框架建立通知bean的方式。可用的值有proxy和aspectj。前者是預設值,表示通知物件是個jdk**;後者表示spring aop會使用aspectj建立**。 

order:指定建立的切面的順序。只要目標物件有多個通知就可以使用該屬性。 

proxy-target-class:該屬性如果為true就表示你想要**目標類而不是bean所實現的所有介面。default="false" 

探索@transactional註解: 

你可以指定傳播、隔離級別、超時以及允許和不允許的異常。 

@transactional註解的屬性: 

propagation:指定事務定義中使用的傳播 

isolation:設定事務的隔離級別 

timeout:指定事務的超市(秒) 

readonly:指定事務的超時 

norollbackfor:目標方法可丟擲的異常所構成的陣列,但通知仍會提交事務 

rollbackfor:異常所構成的陣列,如果目標方法丟擲了這些異常,通知就會回滾事務 

基於註解的事務管理小結: 

如果定義在類上,那麼所有的方法都使用相同的方式,有些read就會抱怨給太多的東西了。 

如果在每個方法上都定義註解,那麼就會很麻煩。 

(可以使用xml aop事務管理能更好的處理這種情況) 

場景二:aop與日誌

使用aspectj框架對操作日誌進行記錄

場景三:aop與快取

1 . 獲取到攔截方法的 @cache 註解,並生成快取 key;

2 . 通過快取 key,去快取中獲取資料;

3 . 如果快取命中,執行如下流程:

4 . 如果快取沒有命中,執行如下流程:

快取是用於解決高併發場景下系統的效能及穩定性問題的。

對spring AOP的理解

aop的概念 aspect oriented programming 面向切面的程式設計 優點 在不破壞程式原有架構的基礎上對程式注入新的邏輯 降低了程式耦合度 提高了程式的靈活性 實現方法 jdk的proxy,cglib的生成二進位制檔案 繼承 物件方法等 實現方法的優缺點 這裡只考慮以上兩種 j...

對Spring AOP機制的初步理解

有兩個service類 service public class myserviceaimpl implements myservicea service public class myservicebimpl implements myserviceb 假設有幾十個這樣的service類,類似一樣...

spring aop的理解記錄

對aop的一些理解記錄。連線點 joinpoint 切入點 pointcut 通知 advice 和切面 aspect 假設乙個物件小明,小明這個物件有四個方法 吃喝拉耍。還有乙個物件是他的僕人。假設僕人要完成對小明行為的aop,那麼這個時候,站在僕人的角度 連線點就是小明擁有的四個方法 吃喝拉耍,...