更新時間:2022-12-30 14:30:42 來源:動力節點 瀏覽1754次
1.什么是SpringAop?
一般稱為面向切面編程,用于將那些與業務無關,但卻對多個對象產生影響的公共行為和邏輯,抽取并封裝為一個可重用的模塊,這個模塊被命名為“切面”(Aspect),減少系統中的重復代碼,降低了模塊間的耦合度,同時提高了系統的可維護性。
2.AOP的相關概念
(1)切面(Aspect): 在Spring Aop指定就是“切面類” ,切面類會管理著切點、通知。
(2)連接點(Join point): 連接點是在應用執行過程中能夠插入切面(Aspect)的一個點。這些點可以是調用方法時,拋出異常時。它是一個虛擬的概念,例如坐地鐵的時候,每一個站都可以下車,那么這每一個站都是一個接入點。假如一個對象中有多個方法,那么這個每一個方法就是一個連接點。
(3)通知(Advice): 就是需要增加到業務方法中的公共代碼, 通知有很多種類型分別可以在需要增加的業務方法不同位置進行執行(前置通知、后置通知、異常通知、返回通知、環繞通知)
(4)切點(Pointcut): 核心方法, 結合切點表達式進行實現
(5)目標對象(Target Object): 指定是增強的對象
(6)織入(Weaving) : spring aop用的織入方式:動態代理。 就是為目標對象創建動態代理的過程就叫織入。
核心原理:觀察所調用的方法是否符合切入點表達式,如果符合,則使用代理執行增強方法
3.Spring通知有哪些類型
前置通知(Before):在目標方法被調用之前調用通知功能;
后置通知(After):在目標方法完成之后調用通知,此時不會關心方法的輸出是什么;
返回通知(After-returning ):在目標方法成功執行之后調用通知;
異常通知(After-throwing):在目標方法拋出異常后調用通知;
環繞通知(Around):通知包裹了被通知的方法,在被通知的方法調用之前和調用之后執行自定義的行為。
4.JDK動態代理和CGLIB動態代理的區別
JDK動態代理只提供接口的代理,不支持類的代理
該代理類是實現了目標類接口, 并且代理類會實現接口所有的方法增強代碼。
調用時 通過代理類先去調用處理類進行增強,再通過反射的方式進行調用目標方法。從而實現AOP
如果代理類沒有實現 接口,那么Spring AOP會選擇使用CGLIB來動態代理目標類。
CGLIB在運行時動態的生成目標類的一個子類。并且會重寫父類所有的方法增強代碼,調用時先通過代理類進行增強,再直接調用父類對應的方法進行調用目標方法。從而實現AOP。
5.SpringAop的工作過程
1.Spring 創建IOC容器
先掃掃描包中的所有由@Service 和@Component修飾的類,并為它們創建對象,放在Spring IOC容器中。
2.尋找切面類
Spring在創建完對象后,開始尋找由 @Aspect 修飾的切面類并獲取切面類中的所有方法。
3.尋找切面類的方法中帶有表達式的部分
接下來,Spring找到所有由合法表達式修飾的方法
4.查找有相應方法的類
隨后,Spring檢查它所掃描到的所有類,并將上一步中找到的方法與所有類進行對照,找出有這個(些)方法的類(這個類就是被代理類)。
5.創建動態對象
最后,Spring根據上一步找到的被代理類以及切面類創建動態類的動態對象并放入Spring IOC容器中。
6.Spring的事務管理機制
使用AOP實現
編程式事務管理:這意味你通過編程的方式管理事務,給你帶來極大的靈活性,但是難維護。
聲明式事務管理:這意味著你可以將業務代碼和事務管理分離,你只需用注解和XML配置來管理事務。業務層的每個方法都是一個事務(業務邏輯層不要捕獲異常)
7.Spring的事務傳播行為
事務傳播行為類型 | 說明 |
oropagation required | 如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。 |
propagation supports | 支持當前事務,如果當前沒有事務,就以非事務方式執行 |
propagation mandatory | 使用當前的事務,如果當前沒有事務,就拋出異常 |
propagation requires new | 新建事務,如果當前存在事務,把當前事務掛起. |
propagation not supported | 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起 |
propagation never | 以非事務方式執行,如果當前存在事務,則拋出異常。 |
propagation nested | 如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與REOUIRED類似的操作。 |
以上就是“死磕到底的aop面試題”,你能回答上來嗎?如果想要了解更多的Java面試題相關內容,可以關注動力節點Java官網。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習