天天看點

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

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

在實際研發中,Spring是我們經常會使用的架構,畢竟它們太火了,也是以Spring相關的知識點也是面試必問點,今天我們就大話Aop。

特地在周末推文,因為該篇文章閱讀起來還是比較輕松诙諧的,當然了,更主要的是周末的我也在充電學習,希望有追求的朋友們也盡量不要放過周末時間,适當充電,為了走上人生巅峰,迎娶白富美。【話說有沒有白富美介紹(o≖◡≖)】

接下來,直接進入正文。

為什麼要有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.(…))

可以看出來,格式使用了正常表達式來定義那個範圍内的類、那些接口會被當成切點,簡單明了。

Advice

Advice行内很多人都定義成了通知,但是我總覺得有點勉強。所謂的Advice其實就是定義了Aop何時被調用,确實有種通知的感覺,何時調用其實也不過以下幾種:

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

JoinPoint【連接配接點】

JoinPoint連接配接點,其實很好了解,上面又有通知、又有切點,那和具體業務的連接配接點又是什麼呢?沒錯,其實就是對應業務的方法對象,因為我們在橫切代碼中是有可能需要用到具體方法中的具體資料的,而連接配接點便可以做到這一點。

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

先給出兩個業務内的接口,一個是聊天,一個是購買東西

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

接下來該給出說了那麼久的切片了

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

可以從中看到PointCut【切點】是

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

Advice是

Before

JoinPoint【連接配接點】是

MethodSignature signature = (MethodSignature) joinPoint.getSignature();

Method method = signature.getMethod();

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

那麼如何拿到具體業務方法内的具體參數呢?

這裡是定義了一個新的注解

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

作用可以直接看注釋,使用地方如下

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

可以看到對應接口使用了AuthPermission的注解,而取出的地方在于

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

是的,這樣便可以取出來對應的接口傳遞的userId具體是什麼了,而校驗邏輯可以自己處理。

送佛送到西,不對,撸碼撸整套,接下來給出運作的主類

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

可以看到,上面有一個接口傳遞的userId是1,另一個是123,而上面權限認證隻有1才說通過,否則會抛出異常。

運作結果如下

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

運作結果可想而知,1的通過驗證,123的失敗。

Aop的原了解析

關于原了解析,由于大家都不喜歡看篇幅太長的文章,是以打算拆分成兩篇進行,下篇文章會對Aop的原理和設計思想進行解析,有興趣的朋友可以關注我一波。

公衆号主營:服務端程式設計相關技術解說,具體可以看曆史文章。

公衆号副業:各種陪聊吹水,包括技術、就業、人生經曆、大學生活、内推等等。

歡迎關注,一起侃大山

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