Spring AOP是Spring衆多優秀特性中的一個,我一直對它的實現比較好奇,最近有些閒暇時間,就整理了一些有關Spring AOP實現的資料。在整理的過程當中,又稍做深刻的理解一些優秀的框架和工具,好比asm,CGLIB,AspectJ等,頓覺本身知識淺薄,固然也難以抑制分享的衝動,因而就決定作一個系列文章——Spring AOP實現原理。html
文章總共分爲5部分:spring
AOP簡介編程
Spring AOP源碼解析eclipse
筆者認爲重點是3和5,這兩部分針對實現原理作了深刻的探討,有必定基礎的同窗建議直接閱讀重點部分。ide
Wiki對AOP的定義,AOP是一種編程範式,目的是爲了將跨領域的關注點分離出來以達到模塊化。它能夠向現存代碼中增長行爲邏輯而不用修改原有代碼,它是經過指定切入點(pointcut)來實現的,例如向以set爲開頭的函數(function)中增長日誌功能。它能夠實現將一些不是核心的業務邏輯(如日誌等)添加到程序中,而不會使核心代碼混亂。AOP爲面向方面的軟件開發奠基了基礎。模塊化
從定義中,咱們提取幾個關鍵字:函數
咱們以一個簡圖來講明:
從圖中能夠看出,業務A和業務B中都有log業務,面向切面的編程思想就將這些log業務從主業務中剝離出來,單獨造成一個切面(Aspect),而後在切面中進行處理(Advice).
咱們以AspectJ的接入點模型(join-point model)爲例,說明一下AOP中的概念
接入點(Join Point):方法調用,構造器調用,初始化class,實例化對象,成員變量的讀寫,異常處理等均可以成爲接入點
切點(PointCuts):表明了一些接入點(Join Point)的集合,好比:
execution(* set*(*))
複製代碼
以方法接入點爲示例,表達式表明了匹配以set爲開頭而且只有一個參數的方法
Advice:指的能夠在接入點的前(before),中(around),後(after)執行的代碼
切面(Aspect):切面像是一個抽象出來的類,它不只融合了以上的元素,它也能夠包含本身的屬性,方法等,固然,切面也能夠被實例化。在Spring AOP中,切面的應用較爲簡單,爲了便於理解,咱們能夠把切面理解爲一個實現具體業務的類,例如計算Dao層方法執行時間的類。
注:AspectJ中的AOP實現比Spring AOP複雜的多,本文主要以理解Spring AOP爲目的,不作深刻的探討,有興趣進一步學習的同窗能夠參考附件中的AspectJ的官方文檔
前面咱們提到AOP主要應用一些非核心業務邏輯中,咱們看看AOP常見的應用場景
Wiki:en.wikipedia.org/wiki/Aspect…
AspectJ:www.eclipse.org/aspectj/doc…
Spring AOP:docs.spring.io/spring/docs…