摘要:干貨點(diǎn)此處是好好面試系列文的第篇文章。而這也是出現(xiàn)的原因,沒錯(cuò),就是被設(shè)計(jì)出來彌補(bǔ)短板的。運(yùn)行結(jié)果如下運(yùn)行結(jié)果可想而知,的通過驗(yàn)證,的失敗。
【干貨點(diǎn)】此處是【好好面試】系列文的第10篇文章??赐暝撈恼?,你就可以了解Spring中Aop的相關(guān)使用和原理,并且能夠輕松解答Aop相關(guān)的面試問題。
在實(shí)際研發(fā)中,Spring是我們經(jīng)常會(huì)使用的框架,畢竟它們太火了,也因此Spring相關(guān)的知識點(diǎn)也是面試必問點(diǎn),今天我們就大話Aop。
特地在周末推文,因?yàn)樵撈恼麻喿x起來還是比較輕松詼諧的,當(dāng)然了,更主要的是周末的我也在充電學(xué)習(xí),希望有追求的朋友們也盡量不要放過周末時(shí)間,適當(dāng)充電,為了走上人生巔峰,迎娶白富美?!驹捳f有沒有白富美介紹(o???)】
接下來,直接進(jìn)入正文。
為什么要有aop我們都知道Java是一種面向?qū)ο缶幊獭疽簿褪荗OP】的語言,不得不說面向?qū)ο缶幊淌且环N及其優(yōu)秀的設(shè)計(jì),但是任何語言都無法十全十美,對于OOP語言來說,當(dāng)需要為部分對象引入公共部分的時(shí)候,OOP就會(huì)引入大量的重復(fù)代碼【這些代碼我們可以稱之為橫切代碼】。而這也是Aop出現(xiàn)的原因,沒錯(cuò),Aop就是被設(shè)計(jì)出來彌補(bǔ)OOP短板的。Aop便是將這些橫切代碼封裝到一個(gè)可重用模塊中,繼而降低模塊間的耦合度,這樣也有利于后面維護(hù)。
Aop是什么東西學(xué)過Spring的都知道,Spring內(nèi)比較核心的功能便是Ioc和Aop,Ioc的主要作用是應(yīng)用對象之間的解耦,而Aop則可以實(shí)現(xiàn)橫切代碼【如權(quán)限、日志等】與他們綁定的對象之間的解耦,舉個(gè)淺顯易懂的小栗子,在用戶調(diào)用很多接口的地方,我們都需要做權(quán)限認(rèn)證,判斷用戶是否有調(diào)用該接口的權(quán)限,如果每個(gè)接口都要自己去做類似的處理,未免有點(diǎn)sb了,也不夠裝x,因此Aop就可以派上用場了,將這些處理的代碼放到切片中,定義一下切片、連接點(diǎn)和通知,刷刷刷跑起來就ojbk了。
想要了解Aop,就要先理解以下幾個(gè)術(shù)語,如PointCut、Advice、JoinPoint。接下來盡量用白話文描述下。
PointCut【切點(diǎn)】
其實(shí)切點(diǎn)的概念很好理解,你想要去切某個(gè)東西之前總得先知道要在哪里切入是吧,切點(diǎn)格式如下:execution( com.nuofankj.springdemo.aop.Service.*(..))
可以看出來,格式使用了正常表達(dá)式來定義那個(gè)范圍內(nèi)的類、那些接口會(huì)被當(dāng)成切點(diǎn),簡單明了。
Advice
Advice行內(nèi)很多人都定義成了通知,但是我總覺得有點(diǎn)勉強(qiáng)。所謂的Advice其實(shí)就是定義了Aop何時(shí)被調(diào)用,確實(shí)有種通知的感覺,何時(shí)調(diào)用其實(shí)也不過以下幾種:
Before 在方法被調(diào)用之前調(diào)用
After 在方法完成之后調(diào)用
After-returning 在方法成功執(zhí)行之后調(diào)用
After-throwing 在方法拋出異常之后調(diào)用
Around 在被通知的方法調(diào)用之前和調(diào)用之后調(diào)用
JoinPoint【連接點(diǎn)】
JoinPoint連接點(diǎn),其實(shí)很好理解,上面又有通知、又有切點(diǎn),那和具體業(yè)務(wù)的連接點(diǎn)又是什么呢?沒錯(cuò),其實(shí)就是對應(yīng)業(yè)務(wù)的方法對象,因?yàn)槲覀冊跈M切代碼中是有可能需要用到具體方法中的具體數(shù)據(jù)的,而連接點(diǎn)便可以做到這一點(diǎn)。
先給出兩個(gè)業(yè)務(wù)內(nèi)的接口,一個(gè)是聊天,一個(gè)是購買東西
接下來該給出說了那么久的切片了
可以從中看到PointCut【切點(diǎn)】是
execution( com.nuofankj.springdemo.aop.Service.*(..))
Advice是
Before
JoinPoint【連接點(diǎn)】是
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
代碼淺顯易懂,其實(shí)就是將ChatService和BuyService里邊給userId做權(quán)限校驗(yàn)的邏輯抽出來做成切片。
那么如何拿到具體業(yè)務(wù)方法內(nèi)的具體參數(shù)呢?
這里是定義了一個(gè)新的注解
作用可以直接看注釋,使用地方如下
可以看到對應(yīng)接口使用了AuthPermission的注解,而取出的地方在于
是的,這樣便可以取出來對應(yīng)的接口傳遞的userId具體是什么了,而校驗(yàn)邏輯可以自己處理。
送佛送到西,不對,擼碼擼整套,接下來給出運(yùn)行的主類
可以看到,上面有一個(gè)接口傳遞的userId是1,另一個(gè)是123,而上面權(quán)限認(rèn)證只有1才說通過,否則會(huì)拋出異常。
運(yùn)行結(jié)果如下
運(yùn)行結(jié)果可想而知,1的通過驗(yàn)證,123的失敗。
關(guān)于原理解析,由于大家都不喜歡看篇幅太長的文章,因此打算拆分成兩篇進(jìn)行,下篇文章會(huì)對Aop的原理和設(shè)計(jì)思想進(jìn)行解析,有興趣的朋友可以關(guān)注我一波。
公眾號主營:服務(wù)端編程相關(guān)技術(shù)解說,具體可以看歷史文章。
公眾號副業(yè):各種陪聊吹水,包括技術(shù)、就業(yè)、人生經(jīng)歷、大學(xué)生活、內(nèi)推等等。
歡迎關(guān)注,一起侃大山
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75201.html
摘要:總結(jié)動(dòng)態(tài)代理的相關(guān)原理已經(jīng)講解完畢,接下來讓我們回答以下幾個(gè)思考題。 【干貨點(diǎn)】 此處是【好好面試】系列文的第12篇文章。文章目標(biāo)主要是通過原理剖析的方式解答Aop動(dòng)態(tài)代理的面試熱點(diǎn)問題,通過一步步提出問題和了解原理的方式,我們可以記得更深更牢,進(jìn)而解決被面試官卡住喉嚨的情況。問題如下 SpringBoot默認(rèn)代理類型是什么 為什么不用靜態(tài)代理 JDK動(dòng)態(tài)代理原理 CGLIB動(dòng)態(tài)代理...
摘要:又是什么其實(shí)就是一種實(shí)現(xiàn)動(dòng)態(tài)代理的技術(shù),利用了開源包,先將代理對象類的文件加載進(jìn)來,之后通過修改其字節(jié)碼并且生成子類。 在實(shí)際研發(fā)中,Spring是我們經(jīng)常會(huì)使用的框架,畢竟它們太火了,也因此Spring相關(guān)的知識點(diǎn)也是面試必問點(diǎn),今天我們就大話Aop。特地在周末推文,因?yàn)樵撈恼麻喿x起來還是比較輕松詼諧的,當(dāng)然了,更主要的是周末的我也在充電學(xué)習(xí),希望有追求的朋友們也盡量不要放過周末時(shí)...
摘要:半路出家的前端程序員應(yīng)該不在少數(shù),我也是其中之一。年,馮馮同事兼師兄看我寫太費(fèi)勁,跟我說對面樓在找,問我要不要學(xué),說出來可能有點(diǎn)丟人,但是在那之前,我真得不知道什么是,什么是。 半路出家的前端程序員應(yīng)該不在少數(shù),我也是其中之一。 為何會(huì)走向前端 非計(jì)算機(jī)專業(yè)的我,畢業(yè)之后,就職于一家電力行業(yè)公司,做過設(shè)備調(diào)試、部門助理、測試,也寫過一段時(shí)間的QT,那三年的時(shí)間,最難過的不是工作忙不忙,...
摘要:禁止內(nèi)聯(lián)腳本執(zhí)行規(guī)則較嚴(yán)格,目前發(fā)現(xiàn)使用。典型的攻擊流程受害者登錄站點(diǎn),并保留了登錄憑證。站點(diǎn)接收到請求后,對請求進(jìn)行驗(yàn)證,并確認(rèn)是受害者的憑證,誤以為是無辜的受害者發(fā)送的請求。攻擊完成,攻擊者在受害者不知情的情況下,冒充受害者完成了攻擊。 隨著互聯(lián)網(wǎng)的發(fā)展,各種Web應(yīng)用變得越來越復(fù)雜,滿足了用戶的各種需求的同時(shí),各種網(wǎng)絡(luò)安全問題也接踵而至。作為前端工程師的我們也逃不開這個(gè)問題,今天一起...
摘要:禁止內(nèi)聯(lián)腳本執(zhí)行規(guī)則較嚴(yán)格,目前發(fā)現(xiàn)使用。典型的攻擊流程受害者登錄站點(diǎn),并保留了登錄憑證。站點(diǎn)接收到請求后,對請求進(jìn)行驗(yàn)證,并確認(rèn)是受害者的憑證,誤以為是無辜的受害者發(fā)送的請求。攻擊完成,攻擊者在受害者不知情的情況下,冒充受害者完成了攻擊。 隨著互聯(lián)網(wǎng)的發(fā)展,各種Web應(yīng)用變得越來越復(fù)雜,滿足了用戶的各種需求的同時(shí),各種網(wǎng)絡(luò)安全問題也接踵而至。作為前端工程師的我們也逃不開這個(gè)問題,今天...
閱讀 2336·2021-10-08 10:04
閱讀 1117·2021-09-03 10:40
閱讀 1163·2019-08-30 15:53
閱讀 3321·2019-08-30 13:13
閱讀 2939·2019-08-30 12:55
閱讀 2292·2019-08-29 13:21
閱讀 1375·2019-08-26 12:12
閱讀 2765·2019-08-26 10:37