SpringAOP淺見與梳理

2021-10-06 21:10:34 字數 3038 閱讀 9506

aspect(層面) oriented(面對) programming(程式設計),即面向切面程式設計,一種軟體開發技術、設計方案。

舉個例子,想象一下,把業務功能想象成乙個大西瓜,把這個大西瓜放到桌子上(桌子是專案),然後用刀沿水平方向,把西瓜切下,每切一下,中間放一張紙,這紙就是要做的切面,那這個切面有什麼用?比如說這樣,第一張紙指定吸水,第二張紙指定吸糖等等。

ps:據說是物件導向程式設計(object oriented programming)一種衍生范型,其實說白了就是在進行oop開發的時候,發現有些東西調整下,可以更簡單,圖方便,於是便在實踐中誕生了乙個新模型就是aop,就邏輯上而言,個人覺得兩者間沒什麼聯絡。

說白了就是,有些地方用aop,能更簡單,更方便,一勞永逸,在開發業務功能時,把一些和業務邏輯無關的東西都抽取出,給**去做。拓展點理解,就是可以降低業務邏輯各部分之間耦合度,提高程式的可重用性,同時提高了開發的效率。

舉個例子,比如專案日誌列印,考慮執行時的問題分析,在呼叫方法前要列印日誌,呼叫後要列印日誌,執行完整個程式也要列印日誌,然後拋異常還得列印日誌,大家都各自列印日誌,規範不好統一,重複**多,最重要的是,有些人還沒有記錄日誌習慣,而且你不得不承認,日誌列印實際和業務功能沒有必須依賴的聯絡,無非更多是程式設計師在分析問題時用,但它確實很重要,沒有日誌,分析問題很費力,那怎麼辦呢?重要又麻煩,而且還和業務功能無關,因此可以考慮把它們抽出來,進行單獨面的處理,即aop。

來點**實際操作下吧。

乙個簡單的除法運算。

public

class

calculator

}

打算將除法這個方法,像切西瓜一樣,切多個面。

public class logaspects

@before

("pointcut()"

)public

void

logstart()

");}

@after

("pointcut()"

)public

void

logend()

@afterreturning

("pointcut()"

)public

void

logreturn()

");}

@afterthrowing

("pointcut()"

)public

void

logexception()

");}

@around

("pointcut()"

)public

around()

throws throwable

}

a) @pointcut/定義切入點

告訴下述這些切面方法,什麼樣的業務類需要做切入,類似公共屬性,如果不用該註解,那就得讓每個方法都去定義切入點。

b) @before/前置通知

呼叫業務方法執行該方法。

c) @after/後置通知

呼叫業務方法執行該方法。

d) @afterreturning/返回通知

呼叫業務方法後正常返回,執行該方法。

e) @afterthrowing/異常通知

呼叫業務方法執行異常,執行該方法。

f) @around/環繞通知

定義呼叫業務方法時,最開始和最末尾需要執行的內容。

a) 正常測試

public

class

demotest

}

測試結果:

@arount:執行目標方法之前...

除法執行..

..引數列表是:

---------

@arount:執行目標方法之後...

除法結束..

....

除法正常返回..

....執行結果是:

1

b) 異常測試
public

class

demotest

}

測試結果:

@arount:執行目標方法之前...

除法執行..

..引數列表是:

---------

除法結束..

....

執行異常..

....異常資訊是:

從csdn上面摘錄的一些東西,說的很具體了,但是不糾結這些吧,主要還是了解下。

就是你想要的功能,也就是上面說的 安全,事物,日誌等。你給先定義好把,然後在想用的地方用一下。

這個更好解釋了,就是spring允許你使用通知的地方,那可真就多了,基本每個方法的前,後(兩者都有也行),或丟擲異常時都可以是連線點,spring只支援方法連線點.其他如aspectj還可以讓你在構造器或屬性注入時都行,不過那不是咱關注的,只要記住,和方法有關的前前後後(丟擲異常),都是連線點。

上面說的連線點的基礎上,來定義切入點,你的乙個類裡,有15個方法,那就有幾十個連線點了對把,但是你並不想在所有方法附近都使用通知(使用叫織入,以後再說),你只想讓其中的幾個,在呼叫這幾個方法之前,之後或者丟擲異常時乾點什麼,那麼就用切點來定義這幾個方法,讓切點來篩選連線點,選中那幾個你想要的方法。

切面是通知和切入點的結合。現在發現了吧,沒連線點什麼事情,連線點就是為了讓你好理解切點,搞出來的,明白這個概念就行了。通知說明了幹什麼和什麼時候幹(什麼時候通過方法名中的before,after,around等就能知道),而切入點說明了在哪幹(指定到底是哪個方法),這就是乙個完整的切面定義。

允許我們向現有的類新增新方法屬性。這不就是把切面(也就是新方法屬性:通知定義的)用到目標類中嗎。

引入中所提到的目標類,也就是要被通知的物件,也就是真正的業務邏輯,他可以在毫不知情的情況下,被咱們織入切面。而自己專注於業務本身的邏輯。

怎麼實現整套aop機制的,都是通過**,這個一會給細說。

把切面應用到目標物件來建立新的**物件的過程。有3種方式,spring採用的是執行時,為什麼是執行時,後面解釋。

框架與元件的淺見

看了眾多牛人,對於眾多的開源專案瞭如指掌,發現自己太無知了,要努力學習。我想我並不需要象牛人們一樣面面俱到,我只需要尋找到一條敏捷開發的道路就可以了,一條就夠了。航海時千萬不要帶兩塊表。我相信pojo annotation將是優秀框架的基礎。fullstack框架,要慎用。由pojo生成的一切 都不...

DIV CSS與Table優劣的淺見

div與table本身並不存在什麼優缺點,所謂web標準只是推薦的是正確的使用標籤,好比說 div用於布局,而table則本來就是轉二維資料的。讓table做該做的事,並不是說頁面裡不出現table就是多麼多麼牛。用div進行排版的優勢就是我不說,大家應該都比較清楚。div是標準,是大勢所趨,但並不...

Spring AOP配置與應用

兩種方式 a 使用annotation b 使用xml annotation a 加上對應的xsd檔案spring aop.xsd b beans.xml c 此時就可以解析對應的annotation了 d 建立我們的攔截類 e 用 aspect註解這個類 f 建立處理方法 g 用 before來註...