一、什么是AOP
AOP(Aspect Oriented Programming 面向切面編程) AOP是傳統的OOP(Object Oriented Programming 面向對象編程)的補充,添加了一些更為完善的功能,和OOP並沒有什么根本上的沖突。解釋下傳統的切片,如果我們想在一根香蕉中間加一段黃瓜,那么我們要怎么做?首先第一步,拿刀從某個部位切開,在將准備好的一段黃瓜放到兩段香蕉中間,我們稱之為放入。那么聯想到我們代碼中來;
比如我們要給我們的service層增加一段代碼,用來計算我們業務層某個功能的性能,首先我們可以直接在代碼中添加一些需求代碼,但是想一下,如果是測試環境,而且是功能模塊不多的情況下我們才能用自己手動添加代碼來實現,生產環境如果也是這樣搞,那么就太耗時間了,萬一你leader說,小李啊,來再把這些功能去掉把。。。艹。顯然如果使用手動往里面寫代碼是不現實的。所有我們要用到AOP。和往香蕉里面添加黃瓜一樣,我們可以將service層的代碼切開(這里專業術語叫“切入點”),然后將我們計算性能的代碼塞進去(這里專業術語叫“織入”),那么我們想用的時候,添加切入點,不想用的時候,直接刪掉,簡直不要太方便。
其實我們不僅可以用AOP來實現計算性能,還有一些,記錄日志、控制事務,等等......
二、專業術語解釋
通知(advice):我們也可以稱之為額外功能,比如添加計算某個模塊的性能、日志、事務;
切入點(pointcut):我們用來增加通知的連接點,通俗點就是,我們放置額外功能的地方;
切面(aspect):我們放置的通知的點所連接成的一個幾何圖形所形成的一個面,就叫切面;
織入(weave):將額外功能放到某個功能上,就叫織入;
三、代理模式
1、靜態代理
所謂代理,用我們現實中的例子來說就是,代理就是明星的經紀人。明星的任務就是演戲、唱歌、上綜藝節目、參加公益活動了,這之類的。明星的任務就是做就行了,至於其他的,全交給經紀人處理,這里經紀人是代理。聯想到我們的代碼中,比如有個xxxService接口還有一個xxxServiceImpl接口的實現類,還有一個proxy代理,那么實現類就是明星,proxy就是經理人,實現類和proxy都要實現xxxService接口,因為明星是不對外溝通演出的事情的,所以要經紀人知道這個明星都是可以做什么,只有實現接口,在proxy中才會有接口中的一些功能。
這樣做有個缺點,就是我們有一個實現類,就要添加一個代理,代碼需要寫的太多了,以至於靜態代理幾乎都不用。。。。;
2、動態代理
在靜態代理的基礎上我們不用在手寫代理類了,直接由程序自動生成,這個代理類我們看不到的,這個代碼也不會出現在我們的程序中,所以相對於靜態代理來講,我們可以省很多的代碼(這里怎么做動態代理就不一一介紹了,大致的就是,定義目標類,將目標類交給Spring管理也就是配置成bean對象,然后創建額外功能類,也是將此交給Spring管理,在后面,創建切入點,最后織入);
其實代理模式就是基於AOP實現的,所有在這里說了一下代理模式。
Spring AOP的東西其實是有很多很多的,我只是自己稍微總結了一下,希望能幫到看到這篇文章的兄弟!!