【好好面試】你必需要懂的Spring-Aop

【乾貨點】此處是【好好面試】系列文的第10篇文章。看完該篇文章,你就能夠了解Spring中Aop的相關使用和原理,而且可以輕鬆解答Aop相關的面試問題。面試

在實際研發中,Spring是咱們常常會使用的框架,畢竟它們太火了,也所以Spring相關的知識點也是面試必問點,今天咱們就大話Aop。
特意在週末推文,由於該篇文章閱讀起來仍是比較輕鬆詼諧的,固然了,更主要的是週末的我也在充電學習,但願有追求的朋友們也儘可能不要放過週末時間,適當充電,爲了走上人生巔峯,迎娶白富美。【話說有沒有白富美介紹(o≖◡≖)】

接下來,直接進入正文。spring

爲何要有aop

咱們都知道Java是一種面向對象編程【也就是OOP】的語言,不得不說面向對象編程是一種及其優秀的設計,可是任何語言都沒法十全十美,對於OOP語言來講,當須要爲部分對象引入公共部分的時候,OOP就會引入大量的重複代碼【這些代碼咱們能夠稱之爲橫切代碼】。而這也是Aop出現的緣由,沒錯,Aop就是被設計出來彌補OOP短板的。Aop即是將這些橫切代碼封裝到一個可重用模塊中,繼而下降模塊間的耦合度,這樣也有利於後面維護。編程

Aop是什麼東西

學過Spring的都知道,Spring內比較核心的功能即是Ioc和Aop,Ioc的主要做用是應用對象之間的解耦,而Aop則能夠實現橫切代碼【如權限、日誌等】與他們綁定的對象之間的解耦,舉個淺顯易懂的小栗子,在用戶調用不少接口的地方,咱們都須要作權限認證,判斷用戶是否有調用該接口的權限,若是每一個接口都要本身去作相似的處理,未免有點sb了,也不夠裝x,所以Aop就能夠派上用場了,將這些處理的代碼放到切片中,定義一下切片、鏈接點和通知,刷刷刷跑起來就ojbk了。框架

想要了解Aop,就要先理解如下幾個術語,如PointCut、Advice、JoinPoint。接下來儘可能用白話文描述下。學習

PointCut【切點】
其實切點的概念很好理解,你想要去切某個東西以前總得先知道要在哪裏切入是吧,切點格式以下:execution( com.nuofankj.springdemo.aop.Service.*(..))
能夠看出來,格式使用了正常表達式來定義那個範圍內的類、那些接口會被當成切點,簡單明瞭。spa

Advice
Advice行內不少人都定義成了通知,可是我總以爲有點勉強。所謂的Advice其實就是定義了Aop什麼時候被調用,確實有種通知的感受,什麼時候調用其實也不過如下幾種:設計

  • Before 在方法被調用以前調用
  • After 在方法完成以後調用
  • After-returning 在方法成功執行以後調用
  • After-throwing 在方法拋出異常以後調用
  • Around 在被通知的方法調用以前和調用以後調用

JoinPoint【鏈接點】
JoinPoint鏈接點,其實很好理解,上面又有通知、又有切點,那和具體業務的鏈接點又是什麼呢?沒錯,其實就是對應業務的方法對象,由於咱們在橫切代碼中是有可能須要用到具體方法中的具體數據的,而鏈接點即可以作到這一點。日誌

給出一個Aop在實際中的應用場景

先給出兩個業務內的接口,一個是聊天,一個是購買東西
圖片描述
圖片描述
接下來該給出說了那麼久的切片了
圖片描述
能夠從中看到PointCut【切點】是code

execution( com.nuofankj.springdemo.aop.Service.*(..))

Advice是對象

Before

JoinPoint【鏈接點】是

MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();

代碼淺顯易懂,其實就是將ChatService和BuyService裏邊給userId作權限校驗的邏輯抽出來作成切片。

那麼如何拿到具體業務方法內的具體參數呢?
這裏是定義了一個新的註解
圖片描述
做用能夠直接看註釋,使用地方以下
圖片描述
能夠看到對應接口使用了AuthPermission的註解,而取出的地方在於
圖片描述
是的,這樣即可以取出來對應的接口傳遞的userId具體是什麼了,而校驗邏輯能夠本身處理。

送佛送到西,不對,擼碼擼整套,接下來給出運行的主類
圖片描述
能夠看到,上面有一個接口傳遞的userId是1,另外一個是123,而上面權限認證只有1才說經過,不然會拋出異常。

運行結果以下
圖片描述
運行結果可想而知,1的經過驗證,123的失敗。

Aop的原理解析

關於原理解析,因爲你們都不喜歡看篇幅太長的文章,所以打算拆分紅兩篇進行,下篇文章會對Aop的原理和設計思想進行解析,有興趣的朋友能夠關注我一波。


公衆號主營:服務端編程相關技術解說,具體能夠看歷史文章。

公衆號副業:各類陪聊吹水,包括技術、就業、人生經歷、大學生活、內推等等。

歡迎關注,一塊兒侃大山

8.png

相關文章
相關標籤/搜索