文章會同時發佈在同名公衆號《碼可思》,一個適合學生黨的公衆號!
帶你通俗易懂走進編程世界!面試
在軟件業,AOP爲Aspect Oriented Programming的縮寫,意爲:面向切面編程,經過預編譯方式和運行期間動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是軟件開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生範型。利用AOP能夠對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度下降,提升程序的可重用性,同時提升了開發的效率。正則表達式
有一天面試官問你什麼是OOP?
而後你可能會一臉懵逼的說OOP?what?這是什麼玩意!其實它就是你一直學的面向對象編程(Object Oriented Programming),編程
那麼咱們要怎麼理解面向對象編程呢?緩存
咱們都知道面向對象編程以前還有一個面向過程編程。咱們學習編程的基礎C語言就是面向過程的編程。要怎麼具體理解這二者的區別呢?性能優化
舉個簡單的例子。當你要吃一份蛋炒飯的時候,你該怎麼辦,下面給你兩個選擇!
一、 本身買食材,而後煮飯,炒蛋,加上一切你想下的配料而後最後炒完出鍋。框架
二、你去某某某大酒店,坐下大喊:「服務員!來一份蛋炒飯」(應該不會被打死吧,就點一份蛋炒飯)函數式編程
看出來區別了嘛!其實說到這裏應該都有感受了,1就是面向過程的,2就是面向對象的!函數
那麼這兩種編程方式到底有什麼區別呢?
性能
第二種的話,你不須要知道蛋炒飯具體是怎麼作的,你只須要點餐而後最後就能吃到。若是你點完忽然不想吃了(在服務員沒炒以前哈,否則老闆可能覺得你搞事情,會把你轟出去!),想換成牛肉炒飯,此時你只須要跟老闆說一聲就能換了。而後若是你自己是第一種的話,你剛買的食材就廢了。由於你只有雞蛋,沒有牛肉,可能一切就得從新來過!這就二者最明顯的區別學習
面向過程是一步一步分析,一步一步實現的,面向對象是模型化的,咱們只須要抽象出一個類就行,封裝起來,而後要用的時候直接調用。至於具體裏面怎麼實現的(就是蛋炒飯怎麼抄的徹底不關咱們的事情,咱們只須要吃就好了!)
因此如今來總結一下二者的優缺點:
面向對象:
面向過程:
而後下面回到咱們今天的主題,AOP面向切面編程!是在咱們的 OOP的基礎上提出來的!
AOP是面向切面編程,那麼這個切面究竟是指什麼呢?
其實很容易理解,一個完整的西瓜,咱們拿一把刀沿着中間切下去,此時咱們就獲得了兩個切面。在編程中,對象與對象之間,方法與方法之間,模塊與模塊之間都是一個個切面
先來講一下咱們很熟悉的一個例子:
例如:如今有一個 Dog類 和 Cat類,它們都有共同的方法,它們都能跑 run(),都能吃 eat()。
在咱們 OOP
中,此時就會寫一個 Animal類,這個類有了 Dog類和 Cat類中共同的方法。run() 和 eat()
這樣的話咱們就只須要在實現 Dog和Cat 的時候,去繼承 Animal類便可!這樣確實減小了咱們重複代碼的書寫。
可是如今問題來了!
若是此時在咱們的父類中多個方法的相同位置中,出現了不少重複的代碼!此時應該怎麼辦?還有的是,Java只提供單繼承,不能繼承其它父類。
OOP 是一個縱向的的體系,從上到下的。
因此此時咱們的主角來了!AOP 面向切面的。把這一到處須要用到這些共同方法地方都當作一個切面,而後把共同方法獨立出來。再橫切進去。
可能有人會想說,咱們父類中,不就是把子類中共同的方法提出來了嘛?那麼這不是同樣的嗎?
可是咱們還須要想到的一點就是,父類中也會有本身的一些動做(本身的業務代碼),此時和這些子類的共同方法混雜在了一塊兒,這個時候就會顯色十分的臃腫!變得不易維護!
AOP就是用來解決這些問題的!
AOP 將咱們這些所謂的須要橫切的代碼單獨提取出來,和原來的業務代碼進行了分離。
上面這張圖就可以很明顯的看出來,這二者的不一樣。在這個過程當中,須要保證的是,原來的業務代碼不能被破壞掉!
經過上面的分析能夠發現,AOP 主要用來解決:在不改變原有業務邏輯的狀況下,加強橫切邏輯代碼,根本上解耦合,避免橫切邏輯代碼重複。
學習了Spring的同窗可能就知道,在Spring中,有兩個很重要的東西,一個是 IOC , 另一個就是 AOP了, IOC在個人上一篇文章就已經帶着你們理解了一遍了,沒看的同窗們能夠查看歷史消息。在Spring中, AOP有不少專業的概念,如下爲你們列了出來:
Aspect
(切面): Aspect 聲明相似於 Java 中的類聲明,在 Aspect 中會包含着一些 Pointcut 以及相應的 Advice。Joint point
(鏈接點):表示在程序中明肯定義的點,典型的包括方法調用,對類成員的訪問以及異常處理程序塊的執行等等,它自身還能夠嵌套其它 joint point。Pointcut
(切點):表示一組 joint point,這些 joint point 或是經過邏輯關係組合起來,或是經過通配、正則表達式等方式集中起來,它定義了相應的 Advice 將要發生的地方。Advice
(加強):Advice 定義了在 Pointcut
裏面定義的程序點具體要作的操做,它經過 before、after 和 around 來區別是在每一個 joint point 以前、以後仍是代替執行的代碼。Target
(目標對象):織入 Advice
的目標對象.。Weaving
(織入):將 Aspect
和其餘對象鏈接起來, 並建立 Advice
的 object 的過程而後最後舉一個例子,例子是在CSDN上面看到的,很是的形象!文字有點多,可是仍是但願你們把它看完,看完後真的受益不淺
讓咱們來假設一下, 從前有一個叫爪哇的小縣城, 在一個月黑風高的晚上, 這個縣城中發生了命案. 做案的兇手十分狡猾, 現場沒有留下什麼有價值的線索. 不過萬幸的是, 剛從隔壁回來的老王剛好在這時候無心中發現了兇手行兇的過程, 可是因爲天色已晚, 加上兇手蒙着面, 老王並無看清兇手的面目, 只知道兇手是個男性, 身高約七尺五寸. 爪哇縣的縣令根據老王的描述, 對守門的士兵下命令說: 凡是發現有身高七尺五寸的男性, 都要抓過來審問. 士兵固然不敢違背縣令的命令, 只好把進出城的全部符合條件的人都抓了起來.
首先咱們知道, 在 Spring AOP 中 Joint point
指代的是全部方法的執行點, 而 point cut 是一個描述信息, 它修飾的是 Joint point
, 經過 point cut, 咱們就能夠肯定哪些 Joint point
能夠被織入 Advice
. 對應到咱們在上面舉的例子, 咱們能夠作一個簡單的類比, Joint point
就至關於 爪哇的小縣城裏的百姓,pointcut
就至關於 老王所作的指控, 即兇手是個男性, 身高約七尺五寸, 而 Advice
則是施加在符合老王所描述的嫌疑人的動做: 抓過來審問.
爲何能夠這樣類比呢?
Joint point
: 爪哇的小縣城裏的百姓: 由於根據定義, Joint point
是全部可能被織入 Advice
的候選的點, 在 Spring AOP中, 則能夠認爲全部方法執行點都是 Joint point
. 而在咱們上面的例子中, 命案發生在小縣城中, 按理說在此縣城中的全部人都有多是嫌疑人.Pointcut
:男性, 身高約七尺五寸: 咱們知道, 全部的方法(joint point) 均可以織入 Advice
, 可是咱們並不但願在全部方法上都織入 Advice
, 而 Pointcut
的做用就是提供一組規則來匹配joinpoint, 給知足規則的 joinpoint 添加 Advice
. 同理, 對於縣令來講, 他再昏庸, 也知道不能把縣城中的全部百姓都抓起來審問, 而是根據兇手是個男性, 身高約七尺五寸, 把符合條件的人抓起來. 在這裏 兇手是個男性, 身高約七尺五寸 就是一個修飾謂語, 它限定了兇手的範圍, 知足此修飾規則的百姓都是嫌疑人, 都須要抓起來審問.Advice
:抓過來審問, Advice
是一個動做, 即一段 Java 代碼, 這段 Java 代碼是做用於 point cut 所限定的那些 Joint point
上的. 同理, 對比到咱們的例子中, 抓過來審問 這個動做就是對做用於那些知足 男性, 身高約七尺五寸 的爪哇的小縣城裏的百姓.Aspect
::Aspect
是 point cut 與 Advice
的組合, 所以在這裏咱們就能夠類比: 「根據老王的線索, 凡是發現有身高七尺五寸的男性, 都要抓過來審問」 這一整個動做能夠被認爲是一個 Aspect
.因此這個小故事其實很好的向咱們展現了彼此之間的關係!
可以看到這裏的同窗,我以爲毅力是至關的好的!由於這篇文章基本全身理論性的東西,阿藍在書寫和規劃的過程也是有想到寫出來會十分的枯燥!可是沒辦法,咱們看完了可以掌握到它的精髓,這就很足夠了!
Authentication 權限
Caching 緩存
Context passing 內容傳遞
Error handling 錯誤處理
Lazy loading 懶加載
Debugging 調試
logging, tracing, profiling and monitoring 記錄跟蹤 優化 校準
Performance optimization 性能優化
Persistence 持久化
Resource pooling 資源池
Synchronization 同步
Transactions 事務
最後但願這篇文章可以幫助到你,若是文章中存在什麼錯誤,請你們加以指正!