一、什麼是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不要到處攔截,一般用於攔截業務層