關於Spring的筆試題(二)

1.談談你所理解AOP?

AOP的具體思想是:定義一個切面,在切面的縱向定義處理方法,處理完成之後,回到橫向業務流。實現AOP的技術,主要分爲兩大類:一是採用動態代理技術,利用截取信息的方式,對該信息進行裝飾,以取代魚油對象行爲的執行;二是採用靜態織入的方式,引入特定的語法創建“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的代碼。


2.AOP中的一些術語

通知、增強處理(Advice 就是你想要的功能,也就是上說的安全、事物、日子等。你給先定義好,然後再想用的地方用一下。包含Aspect的一段處理代碼

連接點(JoinPoint 這個就更好解釋了,就是spring允許你是通知(Advice)的地方,那可就真多了,基本每個方法的錢、後(兩者都有也行),或拋出異常是時都可以是連接點,spring只支持方法連接點。其他如AspectJ還可以讓你在構造器或屬性注入時都行,不過那不是咱們關注的,只要記住,和方法有關的前前後後都是連接點。

切入點(Pointcut 上面說的連接點的基礎上,來定義切入點,你的一個類裏,有15個方法,那就有十幾個連接點了對吧,但是你並不想在所有方法附件都使用通知(使用叫織入,下面再說),你只是想讓其中幾個,在調用這幾個方法之前、之後或者拋出異常時乾點什麼,那麼就用切入點來定義這幾個方法,讓切點來篩選連接點,選中那幾個你想要的方法。

切面(Aspect 切面是通知和切入點的結合。現在發現了吧,沒連接點什麼事,鏈接點就是爲了讓你好理解切點搞出來的,明白這個概念就行了。通知說明了幹什麼和什麼時候幹(什麼時候通過方法名中的beforafteraround等就能知道),二切入點說明了在哪幹(指定到底是哪個方法),這就是一個完整的切面定義。

引入(introduction 允許我們向現有的類添加新方法屬性。這不就是把切面(也就是新方法屬性:通知定義的)用到目標類中嗎

目標(target 引入中所提到的目標類,也就是要被通知的對象,也就是真正的業務邏輯,他可以在毫不知情的情況下,被咋們織入切面。二自己專注於業務本身的邏輯。

代理(proxy 怎麼實現整套AOP機制的,都是通過代理,這個一會兒給細說。

織入(weaving 把切面應用到目標對象來創建新的代理對象的過程。目標對象 – 項目原始的Java組件。

AOP代理  – AOP框架生成java對象。

AOP代理方法 = advice + 目標對象的方法。


3.Aop實現原理?

通過靜態或着動態代理,在不改變原代碼的情況下,增強方法


4.aop開發流程?

第一步:導入相應jar.

第二步:編寫被代理對象

第三步:寫一個類繼承相關Advice的接口

第四步:生成代理:(配置生成代理:)

第五步:編寫測試類

5.後置通知和返回通知區別?

無論連接點正常返回還是拋出異常,後置通知都會執行。如果只想在連接點返回的時候記錄日誌,應使用返回通知代替後置通知。

在返回通知中,只需要在@AfterReturning註解中添加returning屬性,就可以訪問連接點的返回值。

必須在通知方法的簽名中添加一個同名參數,在運行時Spring AOP會通過這個參數傳遞給返回值。

 

6.後置通知怎麼獲取目標方法返回值,及通知的信息?

訪問目標方法最簡單的做法是定義增強處理方法時,將第一個參數定義爲JoinPoint類型,當該增強處理方法被調用時,該JoinPoint參數就代表了織入增強處理的連接點。JoinPoint裏包含了如下幾個常用的方法Object[]getArgs:返回目標方法的參數SignaturegetSignature:返回目標方法的簽名ObjectgetTarget:返回被織入增強處理的目標對象ObjectgetThis:返回AOP框架爲目標對象生成的代理對象注意:當使用@Around處理時,我們需要將第一個參數定義爲ProceedingJoinPoint類型,該類是JoinPoint的子類。


7.異常通知怎麼獲取目標方法的異常信息?

只在連接點拋出異常時才執行異常通知

 throwing 屬性添加到 @AfterThrowing 註解中, 也可以訪問連接點拋出的異常. Throwable 是所有錯誤和異常類的超類. 所以在異常通知方法可以捕獲到任何錯誤和異常.

如果只對某種特殊的異常類型感興趣, 可以將參數聲明爲其他異常的參數類型. 然後通知就只在拋出這個類型及其子類的異常時才被執行.

 

8.環繞通知的參數可以做哪些事情?

環繞通知在一個方法執行之前和之後執行。它使得通知有機會既在一個方法執行之前又在執行之後運行。並且,它可以決定這個方法在什麼時候執行,如何執行,甚至是否執行。環繞通知經常在在某線程安全的環境下,需要在一個方法執行之前和之後共享某種狀態的時候使用。

發佈了38 篇原創文章 · 獲贊 31 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章