【乾貨點】此處是【好好面試】系列文的第10篇文章。看完該篇文章,你就能夠了解Spring中Aop的相關使用和原理,而且可以輕鬆解答Aop相關的面試問題。面試
在實際研發中,Spring是咱們常常會使用的框架,畢竟它們太火了,也所以Spring相關的知識點也是面試必問點,今天咱們就大話Aop。 特意在週末推文,由於該篇文章閱讀起來仍是比較輕鬆詼諧的,固然了,更主要的是週末的我也在充電學習,但願有追求的朋友們也儘可能不要放過週末時間,適當充電,爲了走上人生巔峯,迎娶白富美。【話說有沒有白富美介紹(o≖◡≖)】spring
接下來,直接進入正文。編程
咱們都知道Java是一種面向對象編程【也就是OOP】的語言,不得不說面向對象編程是一種及其優秀的設計,可是任何語言都沒法十全十美,對於OOP語言來講,當須要爲部分對象引入公共部分的時候,OOP就會引入大量的重複代碼【這些代碼咱們能夠稱之爲橫切代碼】。而這也是Aop出現的緣由,沒錯,Aop就是被設計出來彌補OOP短板的。Aop即是將這些橫切代碼封裝到一個可重用模塊中,繼而下降模塊間的耦合度,這樣也有利於後面維護。框架
學過Spring的都知道,Spring內比較核心的功能即是Ioc和Aop,Ioc的主要做用是應用對象之間的解耦,而Aop則能夠實現橫切代碼【如權限、日誌等】與他們綁定的對象之間的解耦,舉個淺顯易懂的小栗子,在用戶調用不少接口的地方,咱們都須要作權限認證,判斷用戶是否有調用該接口的權限,若是每一個接口都要本身去作相似的處理,未免有點sb了,也不夠裝x,所以Aop就能夠派上用場了,將這些處理的代碼放到切片中,定義一下切片、鏈接點和通知,刷刷刷跑起來就ojbk了。學習
想要了解Aop,就要先理解如下幾個術語,如PointCut、Advice、JoinPoint。接下來儘可能用白話文描述下。設計
PointCut【切點】 其實切點的概念很好理解,你想要去切某個東西以前總得先知道要在哪裏切入是吧,切點格式以下:execution(* com.nuofankj.springdemo.aop.Service.(..)) 能夠看出來,格式使用了正常表達式來定義那個範圍內的類、那些接口會被當成切點,簡單明瞭。3d
Advice Advice行內不少人都定義成了通知,可是我總以爲有點勉強。所謂的Advice其實就是定義了Aop什麼時候被調用,確實有種通知的感受,什麼時候調用其實也不過如下幾種:日誌
JoinPoint【鏈接點】 JoinPoint鏈接點,其實很好理解,上面又有通知、又有切點,那和具體業務的鏈接點又是什麼呢?沒錯,其實就是對應業務的方法對象,由於咱們在橫切代碼中是有可能須要用到具體方法中的具體數據的,而鏈接點即可以作到這一點。cdn
先給出兩個業務內的接口,一個是聊天,一個是購買東西 對象
execution(* com.nuofankj.springdemo.aop.Service.(..))
Advice是
Before
JoinPoint【鏈接點】是
MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod();
代碼淺顯易懂,其實就是將ChatService和BuyService裏邊給userId作權限校驗的邏輯抽出來作成切片。
那麼如何拿到具體業務方法內的具體參數呢? 這裏是定義了一個新的註解
送佛送到西,不對,擼碼擼整套,接下來給出運行的主類
運行結果以下
關於原理解析,因爲你們都不喜歡看篇幅太長的文章,所以打算拆分紅兩篇進行,下篇文章會對Aop的原理和設計思想進行解析,有興趣的朋友能夠關注我一波。