Spring03——有關(guān)于 Spring AOP 的總結(jié)

本文將為各位帶來 Spring 的另一個重點知識點 —— Spring AOP。關(guān)注我的公眾號「Java面典」,每天 10:24 和你一起了解更多 Java 相關(guān)知識點。

什么是 AOP

面向切面編程(aspect-oriented programming),是一種將橫切關(guān)注點與業(yè)務邏輯分離的編程方式。每個橫切關(guān)注點都集中在一個地方,而不是分散在多處代碼中。這樣使我們的服務模塊更加簡潔,因為它們只包含了主要關(guān)注點的代碼,而次要的功能或者說輔助的功能被轉(zhuǎn)移到切面中了。

AOP 主要應用場景有:

  1. Authentication 權(quán)限
  2. Caching 緩存
  3. Context passing 內(nèi)容傳遞
  4. Error handling 錯誤處理
  5. Lazy loading 懶加載
  6. Debugging 調(diào)試
  7. logging, tracing, profiling and monitoring 記錄跟蹤 優(yōu)化 校準
  8. Performance optimization 性能優(yōu)化
  9. Persistence 持久化
  10. Resource pooling 資源池
  11. Synchronization 同步
  12. Transactions 事務

AOP 核心知識點

主要術(shù)語

  • Aspect(切面):切入業(yè)務流程的一個獨立模塊,在一個應用程序可以擁有任意數(shù)量的切面。如事務管理,就是切面的一個應用例子;
  • Join point(連接點):業(yè)務流程在運行過程中需要插入切面的具體位置。如執(zhí)行某個特定方法或者處理異常的時候;
  • Advice(通知):是切面的具體實現(xiàn)方法??煞譃榍爸猛ㄖ˙efore)、后置通知(AfterReturning)、異常通知(AfterThrowing)、最終通知(After)和環(huán)繞通知(Around)五種。實現(xiàn)方法具體屬于哪類通知,是在配置文件和注解中指定的;
  • Pointcut(切入點):用于定義通知應該切入到哪些連接點上,不同的通知通常需要切入到不同的連接點上;
  • Target(目標對象):被一個或者多個切面所通知的對象;
  • Proxy(代理對象):將通知應用到目標對象之后被動態(tài)創(chuàng)建的對象??梢院唵蔚乩斫鉃?,代理對象為目標對象的業(yè)務邏輯功能加上被切入的切面所形成的對象;
  • Weaving(切入):將切面應用到目標對象從而創(chuàng)建一個新的代理對象的過程。這個過程可以發(fā)生在編譯期、類裝載期及運行期。

通知類型

Spring AOP 主要有五種通知類型,分別是前置通知(Before)、后置通知(AfterReturning)、異常通知(AfterThrowing)、最終通知(After)和環(huán)繞通知(Around):

  • Before(前置通知):在連接點之前執(zhí)行的通知,但這個通知不能阻止連接點之前的執(zhí)行流程(除非它拋出一個異常);
  • AfterReturning(后置通知):在連接點正常執(zhí)行完成之后的通知;
  • AfterThrowing(異常通知):在連接點方法拋出異常時執(zhí)行的通知;
  • After(最終通知):在連接點執(zhí)行完成之后的通知(無論是正常完成,還是拋出異常退出執(zhí)行);
  • Around(環(huán)繞通知):可以在連接點執(zhí)行前后都執(zhí)行的通知。

AOP 的兩種代理方式

Spring 提供了兩種方式來生成代理對象: JDKProxy 和 Cglib,具體使用哪種方式生成由 AopProxyFactory 根據(jù) AdvisedSupport 對象的配置來決定。默認的策略是如果目標類是接口,則使用 JDK 動態(tài)代理技術(shù),否則使用 Cglib 來生成代理。

JDK 動態(tài)接口代理

JDK 動態(tài)代理主要涉及到 java.lang.reflect 包中的兩個類:Proxy 和 InvocationHandler。InvocationHandler是一個接口,通過實現(xiàn)該接口定義橫切邏輯,并通過反射機制調(diào)用目標類的代碼,動態(tài)將橫切邏輯和業(yè)務邏輯編制在一起。Proxy 利用 InvocationHandler 動態(tài)創(chuàng)建一個符合某一接口的實例,生成目標類的代理對象。

CGLib 動態(tài)代理

CGLib 全稱為 Code Generation Library,是一個強大的高性能,高質(zhì)量的代碼生成類庫,可以在運行期擴展 Java 類與實現(xiàn) Java 接口,CGLib 封裝了 asm,可以再運行期動態(tài)生成新的 class。和 JDK 動態(tài)代理相比較:JDK 創(chuàng)建代理有一個限制,就是只能為接口創(chuàng)建代理實例,而對于沒有通過接口定義業(yè)務方法的類,則可以通過 CGLib 創(chuàng)建動態(tài)代理。

Spring 系列推薦

Spring02——Spring 中 Bean 的生命周期及其作用域

Spring01——你應該了解的,有關(guān) IOC 容器的一切

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容