面試官:說說SpringAOP實現原理?

AOP(Aspect-Oriented Programming,面向切面編程)是一種編程技術,它允許開發者在不改變現有代碼的情況下,增加新的功能或行爲,這些功能或行爲被稱爲“切面”。

AOP 可以通過預編譯方式和運行期動態代理的方式來實現,它的主要目的是降低業務邏輯的耦合性,提高程序的可重用性和開發效率。

AOP 常用於統一功能的處理,例如:事務管理、日誌記錄、權限檢查等功能。

1.AOP優點分析

使用 AOP 的主要原因有以下幾點:

  1. 模塊化:通過將公共行爲(如日誌記錄、事務管理)提取爲獨立的切面,可以使代碼更加模塊化,提高代碼的可維護性和可讀性。
  2. 減少重複代碼:通過使用 AOP,可以將重複的代碼(如日誌記錄、權限檢查)提取到一個切面中,避免在多個地方重複編寫相同的代碼。
  3. 解耦:AOP 允許開發者將業務邏輯與橫切關注點(如日誌記錄、事務管理)分離,從而降低業務邏輯的耦合性,提高程序的可重用性和可擴展性。

2.AOP技術實現

AOP 實現技術主要分爲兩大類:靜態代理和動態代理。

  1. 靜態代理:通過 AOP 框架提供的命令進行編譯,從而在編譯階段生成 AOP 代理類。這種方式也被稱爲編譯時增強。靜態代理包括編譯時編織和類加載時編織兩種方式。
  2. 動態代理:在運行時在內存中“臨時”生成 AOP 動態代理類,因此也被稱爲運行時增強。動態代理主要有兩種實現方式:
    1. JDK 動態代理:JDK 動態代理要求被代理的類必須實現一個接口,它通過反射來接收被代理的類,並使用 InvocationHandler 接口和 Proxy 類實現代理。
    2. CGLIB 動態代理:CGLIB 則是一個代碼生成的類庫,它可以在運行時動態地生成某個類的子類,通過繼承的方式實現代理。如果目標類沒有實現接口,Spring AOP 會選擇使用 CGLIB 來動態代理目標類。

3.AOP實現原理

Spring AOP(面向切面編程)的實現原理主要基於動態代理技術,它提供了對業務邏輯各個方面的關注點分離和模塊化,使得非功能性需求(如日誌記錄、事務管理、安全檢查等)可以集中管理和維護,而不是分散在各個業務模塊中。

Spring AOP 實現原理的關鍵要點如下:

  1. 代理機制
    • JDK 動態代理:對於實現了接口的目標類,Spring AOP 默認使用 JDK 的 java.lang.reflect.Proxy 類來創建代理對象。代理對象會在運行時實現代理接口,並覆蓋其中的方法,在方法調用前後執行切面邏輯(即通知,advice)。
    • CGLIB 動態代理:對於未實現接口的類,Spring AOP 會選擇使用 CGLIB 庫來生成代理對象。CGLIB 通過字節碼技術創建目標類的子類,在子類中重寫目標方法並在方法調用前後插入切面邏輯。
  2. 關鍵概念
    • 切面(Aspect):切面是一個包含了橫切關注點聲明的模塊化單元,它可以有多個切入點和通知組成。
    • 切入點(Pointcut):切入點定義了匹配通知應該被織入的方法或方法執行點的規則表達式。
    • 通知(Advice):通知是在特定切入點處執行的代碼片段,分爲多種類型,如前置通知(Before advice)、後置通知(After returning advice)、異常後通知(After throwing advice)、最終通知(After (finally) advice)以及環繞通知(Around advice)。
  3. 織入(Weaving):織入是指將切面應用到目標對象來創建一個新的代理對象的過程。在 Spring AOP 中,織入發生在運行時,通過代理對象的方式實現。
  4. 代理工廠:Spring 內部通過 ProxyFactory 或相關的 AOP 基礎設施(如 Advisor、AdvisorChainFactory 等)來創建和管理代理對象。
  5. 執行流程:當客戶端通過代理對象調用目標方法時,代理對象會攔截這個調用,根據切面配置找到對應的通知,並按照通知類型的不同執行相應的增強邏輯。例如,如果是環繞通知,它會完全控制原始方法的調用過程,可以在調用前後插入自定義邏輯,甚至決定是否執行原方法。

通過上述方式,Spring AOP 巧妙地實現了對目標對象方法的攔截和增強,從而實現了面向切面編程的功能。

課後思考

Spring 動態代理失效的場景有哪些?Spring Boot 動態代理默認實現是 JDK 動態代理還是 CGLIB?怎麼證明?

本文已收錄到我的面試小站 www.javacn.site,其中包含的內容有:Redis、JVM、併發、併發、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、設計模式、消息隊列等模塊。

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