天天看點

Spring AOP——Spring 中面向切面程式設計1.Spring AOP是什麼?3. Spring概述

1.Spring AOP是什麼?

Aspect Oriented Programming:面向切面程式設計

什麼時候會出現面向切面程式設計的需求?按照軟體重構的思想,如果多個類中出現重複的代碼,就應該考慮定義一個共同的抽象類,将這些共同的代碼提取到抽象類中,比如Teacher,Student都有username,那麼就可以把username及相關的get、set方法抽取到SysUser中,這種情況,我們稱為縱向抽取。

但是如果,我們的情況是以下情況,又該怎麼辦? 給所有的類方法添加性能檢測,事務控制,該怎麼抽取? PerformanceMonitor TransactionManager AOP就是希望将這些分散在各個業務邏輯代碼中的相同代碼,通過橫向切割的方式抽取到一個獨立的子產品中,讓業務邏輯類依然儲存最初的單純。

AOP

切面、切點,連接配接點、通知

切點是連接配接點的集合,

通知 包含(切入時機,切入内容)

切點、連接配接點、通知 所在的那個類 可以稱為切面

Spring AOP——Spring 中面向切面程式設計1.Spring AOP是什麼?3. Spring概述

1.1 基礎案例說明

為了更好說明,我們接下來,要講解的知識點,我們以一個常見的例子來說明

我們以資料庫的操作為例來說明:

擷取連接配接對象

執行SQL(核心業務代碼)

如果有異常,復原事務,無異常則送出事務

關閉連接配接

上述的幾個部署,“2”是核心業務代碼,其他都是非核心業務代碼,但是我們又必須寫 而面向切面程式設計就是為了解決這樣的問題,将這些非核心業務代碼進行抽離,這樣開發者隻需要關注“核心業務代碼”即可。 這樣開發效率自然提高。

在項目開發中,SpringAOP是非常常用的技能之一,下面我畫一個圖來說明,spring都做了什麼

Spring AOP——Spring 中面向切面程式設計1.Spring AOP是什麼?3. Spring概述

2. AOP術語

連接配接點(Joinpoint) 程式執行的某個特定位置,如某個方法調用前,調用後,方法抛出異常後,這些代碼中的特定點稱為連接配接點。簡單來說,就是在哪加入你的邏輯增強

連接配接點表示具體要攔截的方法,上面切點是定義一個範圍,而連接配接點是具體到某個方法

切點(PointCut) 每個程式的連接配接點有多個,如何定位到某個感興趣的連接配接點,就需要通過切點來定位。比如,連接配接點--資料庫的記錄,切點--查詢條件

切點用于來限定Spring-AOP啟動的範圍,通常我們采用表達式的方式來設定,是以關鍵詞是範圍

增強(Advice) 增強是織入到目标類連接配接點上的一段程式代碼。在Spring中,像BeforeAdvice等還帶有方位資訊

通知是直譯過來的結果,我個人感覺叫做“業務增強”更合适 對照代碼就是攔截器定義的相關方法,通知分為如下幾種:

前置通知(before):在執行業務代碼前做些操作,比如擷取連接配接對象

後置通知(after):在執行業務代碼後做些操作,無論是否發生異常,它都會執行,比如關閉連接配接對象

異常通知(afterThrowing):在執行業務代碼後出現異常,需要做的操作,比如復原事務

傳回通知(afterReturning),在執行業務代碼後無異常,會執行的操作

環繞通知(around),這個目前跟我們談論的事務沒有對應的操作,是以暫時不談

目标對象(Target) 需要被加強的業務對象

織入(Weaving) 織入就是将增強添加到對目标類具體連接配接點上的過程。

織入是一個形象的說法,具體來說,就是生成代理對象并将切面内容融入到業務流程的過程。

代理類(Proxy) 一個類被AOP織入增強後,就産生了一個代理類。

切面(Aspect) 切面由切點和增強組成,它既包括了橫切邏輯的定義,也包括了連接配接點的定義,SpringAOP就是将切面所定義的橫切邏輯織入到切面所制定的連接配接點中。

比如上文讨論的資料庫事務,這個資料庫事務代碼貫穿了我們的整個代碼,我們就可以這個叫做切面。 SpringAOP将切面定義的内容織入到我們的代碼中,進而實作前後的控制邏輯。 比如我們常寫的攔截器Interceptor,這就是一個切面類

2.1 一圖勝千言
Spring AOP——Spring 中面向切面程式設計1.Spring AOP是什麼?3. Spring概述

3. Spring概述

1,AOP程式設計可不是Spring獨有的,Spring隻是支援AOP程式設計的架構之一,這一點非常重要,切勿搞反了關系。

2,AOP分兩類,一類可以對方法的參數進行攔截,一類是對方法進行攔截,SpringAOP屬于後者,是以Spring的AOP是屬于方法級的

3,目标對象,。代理對象

Proxy  傳回代理對象 有兩種方式

 直接擷取一個代理對象

    target object——>Proxy  object   首先産生一個目标對象 然後對目标對象進行代理傳回代理對象。    ——spring初始化的時候

要了解切面程式設計,就需要先了解什麼是切面。用刀把一個西瓜分成兩瓣,切開的切口就是切面;炒菜,鍋與爐子共同來完成炒菜,鍋與爐子就是切面。web層級設計中,web層->網關層->服務層->資料層,每一層之間也是一個切面。程式設計中,對象與對象之間,方法與方法之間,子產品與子產品之間都是一個個切面。