官术网_书友最值得收藏!

4.1 AOP基礎

在第2章中也有介紹AOP,不過側重點是AOP的原理和動態代理,本節主要介紹AOP的基礎知識點。

4.1.1 AOP的引入

這里可以把單個模塊當作一個圓柱,假如沒有AOP,那么在做日志處理的時候,我們就會在每個模塊中添加日志或者權限處理,日志或權限類似圓柱體的部分圓柱,如圖4-1所示。

圖4-1

一般大多數的日志或權限處理代碼是相同的,為了實現代碼復用,我們可能把日志處理抽離成一個新的方法,如圖4-2所示。

圖4-2

即使這樣,我們仍然必須手動插入這些方法,而且這兩個方法是強耦合的。假如此時我們不需要這個功能了,或者想換成其他功能,就必須一個個修改。

通過動態代理,可以在指定位置執行對應流程。這樣就可以將一些橫向的功能抽離出來,形成一個獨立的模塊,然后在指定位置插入這些功能。這樣的思想被稱為面向切面編程,亦即AOP,如圖4-3所示。

圖4-3

4.1.2 AOP主要概念

4.1.1小節介紹了引入AOP的好處,本小節來了解一下AOP的幾個核心概念。

(1)橫切關注點

AOP把一個業務流程分成幾部分,例如權限檢查、業務處理、日志記錄,每個部分單獨處理,然后把它們組裝成完整的業務流,每部分被稱為切面或關注點。

(2)切面

類是對物體特征的抽象,切面就是對橫切關注點的抽象。可以將每部分抽象成一疊紙一樣,一層一層的,那么每張紙都是一個切面。

(3)連接點

因為Spring只支持方法類型的連接點,所以在Spring中連接點指的就是被攔截到的方法,實際上連接點還可以是字段或者構造器。其實,Spring只支持方法類型的連接點包含字段和構造器。因為字段通過get、set方法得到,構造器其實也是方法。Spring只支持方法類型的連接點和連接點是字段或者構造器是包含關系。

(4)切入點

對連接點進行攔截的定義。連接點可以有很多,但并不一定每個連接點都進行操作,比如蓮藕,藕段與藕段之間是有連接點的,但不一定都切開。

(5)通知

通知指的就是指攔截到連接點之后要執行的代碼,分為前置、后置、異常、最終、環繞通知5類。這個有點類似于把藕段與藕段斷開之后要做的事情,是往里面加蜂蜜還是做什么。

(6)目標對象

代理的目標對象,就是動態代理的target,在實際操作中一般會先實現AOP的接口,然后配置這些接口作用到哪些對象上,被作用的對象就是目標對象。

(7)織入

切面是獨立的,目標對象也是獨立的,它們是不耦合的,那它怎么把切面放到目標對象中呢?這時就需要進行織入操作,就類似這種的,怎么把target和打印日志聯系到一起呢?使用動態代理。在Spring中,aop.framework.ProxyFactory用作織入器,進行橫切邏輯的織入。

(8)引入

不改代碼的同時,為類動態地添加方法或字段。

主站蜘蛛池模板: 镇宁| 明星| 卫辉市| 铜川市| 磐安县| 古浪县| 曲阳县| 闸北区| 马龙县| 土默特右旗| 尖扎县| 舒兰市| 开平市| 河北省| 汽车| 银川市| 台东市| 乌兰浩特市| 呈贡县| 新营市| 青田县| 延津县| 东海县| 辽源市| 历史| 萨迦县| 华宁县| 洪湖市| 江山市| 三江| 甘洛县| 吉水县| 陈巴尔虎旗| 尚义县| 南乐县| 平湖市| 徐水县| 樟树市| 马山县| 武邑县| 城口县|