天天看點

約定程式設計SpringAOP-AOP的概念

通過上面約定程式設計的例子,可以看到,隻要按照一定的規則,我們就可以将你的代碼織入事先約定好的流程中。實際上Spring AOP也是一種約定流程的程式設計,在Spring 中可以使用多中方式配置AOP,因為Spring Boot采用注解的方式,是以為了保持一緻,這裡就隻是介紹@Aspectj注解的方式,不過在開啟AOP術語的時候,我們先考慮為什麼使用AOP.

1. 為什麼使用AOP

AOP最為典型的應用實際就是資料庫事務的管控。例如,當我們需要儲存一個使用者時,可能需要連同他的角色資訊一同儲存到資料庫中。于是可以看到如下圖所示的流程圖。

約定程式設計SpringAOP-AOP的概念

這裡的使用者資訊和使用者角色資訊,我們都可以使用面向對象程式設計(OOP)進行設計碼,但是他們在資料庫事務中的要求是,要麼一起成功,要麼一起失敗,這樣OOP就無能為力了。資料庫事務毫無疑問是企業級應用關注的核心問題之一,而使用AOP可以解決這些問題。

AOP還可以減少大量重複的工作。在Spring流行之前,我們可以使用JDBC代碼實作很多的資料庫工作,例如。插入一個使用者資訊。我們可以用JDBC代碼來實作。

我們先描述一下流程:

  • 打開資料庫連結,然後對其屬性進行設定
  • 執行SQL語句
  • 如果沒有異常送出事務
  • 如果發生異常則復原事務
  • 關閉資料庫事務連接配接

這個流程可以使用如下流程圖描述:

約定程式設計SpringAOP-AOP的概念

這張圖與約定程式設計的圖不太一樣,但是還是接近的。如果我們通過約定程式設計設計如圖,你也許會更感興趣

約定程式設計SpringAOP-AOP的概念

從圖中可以看到,叢資料庫的打開,關閉以及事務的送出復原都有預設的流程給你實作。換句話說,你不需要完成他們,你需要得任務是編寫SQL這一步而已,然後織入流程中。我們可以使用Spring AOP處理一些無法使用OOP實作的業務邏輯。其次通過約定,可以将一些業務邏輯織入流程中,并且可以将一些通用的邏輯抽取出來,然後給予預設實作,這樣你隻需要完成部分的功能就可以了,這樣可以使的開發者的代碼更加簡潔,同時,可維護性也得到提高。在後面資料庫事務和Redis開發的章節中,我們還會再次看到他的威力。

2. AOP術語和流程

上面的内容已經介紹約定程式設計和為什麼使用AOP,接下來是時候介紹AOP的術語和流程了,相信有了約定程式設計的概念之後AOP的概念也會更加容易了解。不過,Spring AOP是一種基于方法的AOP,他隻能應用在方法上。

下面我們來講解AOP的術語:

- 連接配接點(join point):對應的是具體攔截的對象,因為Spring隻支援方法,是以被攔截的對象往往就是值特定的方法。例如我們前面提到的HelloServiceInpl的Hello方法就是一個連接配接點,AOP将會通過動态代理技術把它織入對應的流程中。

- 切點(point cut):有時候,我們的切面不單單應用于單個方法,也可能是多個類的不同方法,這時,可以通過正規表達式或者訓示器的規則去定義,進而适配連接配接點。切點就是提供這樣一個功能的概念。

- 通知(advice):就是按照約定流程下的方法,分為前置通知(before advice),後置通知(after advice),環繞通知(around advice),事後傳回通知(afterReturning advice)和異常通知(afterThrowing advice),他會根據約定織入流程中,需要弄明白他們在約定中的順序和運作的條件。

- 目标對象(target):即被代理對象,例如約定程式設計中的HelloServiceImpl執行個體就是一個目标對象,他被代理了。

- 引入(introduction):是指引入新的類和其他方法,增強現有Bean的功能。

- 織入(weaving):他是通過動态代理技術,為原有服務對象生成代理對象,然後将與切點定義比對的連接配接點攔截,并且按照約定将各類通知織入約定流程的過程。

-切面(aspect):是一個可以定義切點,各類通知和引入的内容。Spring AOP将通過他的資訊來增強Bean的功能或者将對應的方法織入流程。 顯然上面的描述還是比較抽象的,如圖所示是對其進一步的說明。

約定程式設計SpringAOP-AOP的概念