面試——aop

一、什麼是AOP

AOP:大體可以理解爲面向切面編程,詳解可以百度:https://baike.baidu.com/item/AOP/1332219?fr=aladdin

二、AOP是基於什麼實現的

AOP是基於動態代理實現的,而動態代理可以理解爲動態執行方法,動態加載類。

三、AOP在ssm框架中是如何執行的,怎麼使用的反射機制

我在我的項目業務層增加了一個空指針異常,來查看ssm框架如何調用




從異常拋出的順序來看,可以得到ssm框架的運行順序

1.請求發送過來後,服務器線程池發配一個線程處理請求

2.過濾器攔截請求對請求進行判斷和過濾

3.經過過濾器的請求經過來到DispatherServlet主控制器,並根據域名找到應當執行的控制器,並用反射來執行控制器

4.控制器調用com.sun.proxy.$Proxy——也即是動態代理(aop底層就是用動態代理和反射實現的)

5.aop通過反射調用業務層方法,發現了空指針異常。

四、AOP內部執行順序以及註解

概念:

1.目標方法:被AOP攔截的業務方法,稱爲目標方法。

2.註解:@Before,@After,@Afterthrowing,@AfterReturning,@Around

@Before註解:在業務方法之前執行,也就是說在業務層之前執行
@After註解:在業務方法之後執行,也就是在業務層之後執行

案例

aop:


業務層:


啓動tomcat後執行順序爲:

Hello world——>login——>After

@AfterReturning與@AfterThrowing

這兩個註解顧名思義,配合try-catch執行,不過try-catch被aop所封裝

案例


執行順序:


(1)如果沒有異常,則控制器調用aop,先執行@Before,之後調用業務方法,再調用AfterReturning,最終調用After。

顯示順序:hello world——>login——>After——>AfterReturning

顯示順序雖然after是先於AfterReturning之前調用,這是spring做了一些機制處理,將After再AfterReturning之前調用,如果想要按照正常try-catch順序進行,要使用@Around註解

(2)有異常,則順序爲:@Before——>業務層——>@AfterThrowing——>@After

顯示順序:hello world——>login——>AfterThrowing——>After

@Around註解(環繞通知)

環繞通知:再業務方法前後調用

執行順序



其中return val返回值會將值賦給Contrller中的User對象,然後將Controller返回給瀏覽器。

我們可以再return val這裏做手腳,如上上圖,拋出異常,或者返回一個別的值,干預業務方法的返回結果。

事務控制:aop的延申適用,對jdbc的事務處理進行封裝

要想要@Transactional生效,需要配置事務管理器:TransactionalManager

五、aop的切入點

bean與within:

注意:aop不要到處攔截,一般用於攔截業務層

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章