3.0一、Spring AOP的理解

注:轉    https://mp.weixin.qq.com/s/PsgTLn8cdTxdd542XgVkUAexpress

什麼是AOP

AOP(Aspect-Oriented Programming), 即 面向切面編程 , 它與 OOP( Object-Oriented Programming, 面向對象編程) 相輔相成, 提供了與 OOP 不一樣的抽象軟件結構的視角. 
在 OOP 中, 咱們以類(class)做爲咱們的基本單元, 而 AOP 中的基本單元是 Aspect(切面)

一、Aspect(切面)

Aspect 由 pointcount 和 advice 組成, 它既包含了橫切邏輯的定義, 也包括了鏈接點的定義. Spring AOP就是負責實施切面的框架, 它將切面所定義的橫切邏輯織入到切面所指定的鏈接點中. AOP的工做重心在於如何將加強織入目標對象的鏈接點上, 這裏包含兩個工做:編程

1. 如何經過 pointcut 和 advice 定位到特定的 joinpoint 上app

2. 如何在 advice 中編寫切面代碼.框架

能夠簡單地認爲, 使用 @Aspect 註解的類就是切面.spa

二、Advice(加強)

由 aspect 添加到特定的 join point(即知足 point cut 規則的 join point) 的一段代碼. 許多 AOP框架, 包括 Spring AOP, 會將 advice 模擬爲一個攔截器(interceptor), 而且在 join point 上維護多個 advice, 進行層層攔截. 例如 HTTP 鑑權的實現, 咱們能夠爲每一個使用 RequestMapping 標註的方法織入 advice, 當 HTTP 請求到來時, 首先進入到 advice 代碼中, 在這裏咱們能夠分析這個 HTTP 請求是否有相應的權限, 若是有, 則執行 Controller, 若是沒有, 則拋出異常. 這裏的 advice 就扮演着鑑權攔截器的角色了..net

advice的類型:代理

    1) before advice, 在 join point 前被執行的 advice. 雖然 before advice 是在 join point 前被執行, 可是它並不可以阻止 join point 的執行,
           除非發生了異常(即咱們在 before advice 代碼中, 不能人爲地決定是否繼續執行 join point 中的代碼)對象

    2)after return advice, 在一個 join point 正常返回後執行的 advice接口

    3)after throwing advice, 當一個 join point 拋出異常後執行的 adviceget

    4)after(final) advice, 不管一個 join point 是正常退出仍是發生了異常, 都會被執行的 advice

    5)around advice, 在 join point 前和 joint point 退出後都執行的 advice. 這個是最經常使用的 advice

三、Join Point(鏈接點)

程序運行中的一些時間點, 例如一個方法的執行, 或者是一個異常的處理.在 Spring AOP 中, join point 老是方法的執行點, 即全部方法的執行點

四、Point Cut(切點)

匹配 join point 的謂詞Advice 是和特定的 point cut 關聯的, 而且在 point cut 相匹配的 join point 中執行.在 Spring 中, 全部的方法均可以認爲是 join point, 可是咱們並不但願在全部的方法上都添加 Advice, 而 point cut 的做用就是提供一組規則(使用 AspectJ pointcut expression language 來描述) 來匹配join point, 給知足規則的 join point 添加 Advice.

關於join point 和 point cut 的區別:

在 Spring AOP 中, 全部的方法執行都是 join point。 而 point cut 是一個描述信息, 它修飾的是 join point, 經過 point cut, 咱們就能夠肯定哪些 join point 能夠被織入 Advice. 所以 join point 和 point cut 本質上就是兩個不一樣緯度上的東西.advice 是在 join point 上執行的, 而 point cut 規定了哪些 join point 能夠執行哪些 advice

五、 Target (目標對象)

織入 advice 的目標對象. 目標對象也被稱爲 advised object.由於 Spring AOP 使用運行時代理的方式來實現 aspect, 所以 adviced object 老是一個代理對象(proxied object)注意, adviced object 指的不是原來的類, 而是織入 advice 後所產生的代理類

六、Aop proxy(aop  代理)

一個類被 AOP 織入 advice, 就會產生一個結果類, 它是融合了原類和加強邏輯的代理類. 在 Spring AOP 中, 一個 AOP 代理是一個 JDK 動態代理對象或 CGLIB 代理對象

關於 AOP Proxy

Spring AOP 默認使用標準的 JDK 動態代理(dynamic proxy)技術來實現 AOP 代理, 經過它, 咱們能夠爲任意的接口實現代理。
若是須要爲一個類實現代理, 那麼可使用 CGLIB 代理. 當一個業務邏輯對象沒有實現接口時, 那麼Spring AOP 就默認使用
CGLIB 來做爲AOP代理了。 即若是咱們須要爲一個方法織入 advice, 可是這個方法不是一個接口所提供的方法,
則此時 Spring AOP 會使用 CGLIB 來實現動態代理。 鑑於此, Spring AOP 建議基於接口編程, 對接口進行 AOP 而不是類。

七、Weaving(織入)

將 aspect 和其餘對象鏈接起來, 並建立 adviced object 的過程. 根據不一樣的實現技術, AOP織入有三種方式

    1) 編譯器織入, 這要求有特殊的Java編譯器

    2) 類裝載期織入, 這須要有特殊的類裝載器

    3) 動態代理織入, 在運行期爲目標類添加加強(Advice)生成子類的方式. Spring 採用動態代理織入, 而AspectJ採用編譯器織入和類裝載期織入

 

舉例:

    比喻一下 AOP 中 aspect, jointpoint, pointcut 與 advice 之間的關係.

    讓咱們來假設一下, 從前有一個叫爪哇的小縣城, 在一個月黑風高的晚上, 這個縣城中發生了命案. 做案的兇手十分狡猾, 現場沒有留下什麼有價值的線索。
不過萬幸的是, 剛從隔壁回來的老王剛好在這時候無心中發現了兇手行兇的過程, 可是因爲天色已晚, 加上兇手蒙着面, 老王並無看清兇手的面目, 只知道
兇手是個男性, 身高約七尺五寸。爪哇縣的縣令根據老王的描述, 對守門的士兵下命令說: 凡是發現有身高七尺五寸的男性, 都要抓過來審問。士兵固然不敢
違背縣令的命令, 只好把進出城的全部符合條件的人都抓了起來。

    來讓咱們看一下上面的一個小故事和 AOP 到底有什麼對應關係。 首先咱們知道, 在 Spring AOP 中 join point 指代的是全部方法的執行點,
而 point cut 是一個描述信息, 它修飾的是 join point, 經過 point cut, 咱們就能夠肯定哪些 join point 能夠被織入 Advice。 對應到咱們在上面
舉的例子, 咱們能夠作一個簡單的類比, join point 就至關於爪哇的小縣城裏的百姓 , point cut 就至關於 老王所作的指控, 即兇手是個男性, 身高約
七尺五寸 , 而 advice 則是施加在符合老王所描述的嫌疑人的動做: 抓過來審問 . 爲何能夠這樣類比呢?

join point --> 爪哇的小縣城裏的百姓: 由於根據定義, join point 是全部可能被織入 advice 的候選的點, 在 Spring AOP中, 則能夠認爲全部方法執行點都是 join point。
               而在咱們上面的例子中, 命案發生在小縣城中, 按理說在此縣城中的全部人都有多是嫌疑人。
point cut  --> 男性, 身高約七尺五寸: 咱們知道, 全部的方法(joint point) 均可以織入 advice, 可是咱們並不但願在全部方法上都織入 advice, 而 pointcut 的做用就是提供一組
               規則來匹配joinpoint, 給知足規則的 joinpoint 添加 advice. 同理, 對於縣令來講, 他再昏庸, 也知道不能把縣城中的全部百姓都抓起來審問, 而是根據兇手是個男性,
               身高約七尺五寸, 把符合條件的人抓起來. 在這裏 兇手是個男性, 身高約七尺五寸 就是一個修飾謂語, 它限定了兇手的範圍, 知足此修飾規則的百姓都是嫌疑人, 都須要
               抓起來審問。
advice     --> 抓過來審問, advice 是一個動做, 即一段 Java 代碼, 這段 Java 代碼是做用於 point cut 所限定的那些 join point 上的. 同理, 對比到咱們的例子中, 抓過來審問
               這個動做就是對做用於那些知足 男性, 身高約七尺五寸 的爪哇的小縣城裏的百姓.
aspect    :    aspect 是 point cut 與 advice 的組合, 所以在這裏咱們就能夠類比: "根據老王的線索, 凡是發現有身高七尺五寸的男性, 都要抓過來審問" 這一整個動做能夠被認爲
               是一個aspect.
相關文章
相關標籤/搜索