Spring AOP深度學習

爲了更好地應用AOP技術,技術專家們成立了AOP聯盟來探討AOP標準化。對應於現有的AOP實現方案,AOP聯盟對它們進行了必定程度的抽象,從而定義出AOP體系結構(以下圖所示)。結合這個體系結構去了解AOP技術,有助於理解AOP概念。 輸入圖片說明java

AOP聯盟定義的AOP體系結構把與AOP相關的概念大體分爲由高到低從使用到實現的三個層次。從上往下,最高層是語言和開發環境,在這個環境中能夠看到幾個重要的概念:express

  • **基礎(Base)**可視爲待加強對象或者說目標對象;
  • **切面(Aspect)**一般包含對於基礎的加強應用;
  • **配置(Configuration)**能夠當作是一種編織,經過在AOP體系中提供這個配置環境,能夠把基礎和切面結合起來,從而完成切面對目標對象的編織實現。

在Spring AOP實現中,使用Java語言來實現加強對象與切面加強應用,併爲這二者的結合提供了配置環境。對於編織配置,毫無疑問,可使用Spring IoC容器來完成;對於POJO對象的配置,原本就是Spring核心IOC容器的強項。所以,對於使用Spring的AOP開發而言,使用POJO就能完成AOP任務。編程

專業術語

切面(Aspect)

aspectpointcutadvice組成,它既包括了橫切邏輯的定義,也包括了鏈接點的定義。Spring AOP就是負責實施切面的框架,它將切面所定義的橫切邏輯織入到切面所指定的**鏈接點(join point)**中。app

AOP的工做重心在於如何將**加強(advice)織入目標對象的鏈接點(Join point)**上,這裏包含兩個工做:框架

  1. 如何經過poincut和advice定位到特定的joinpoint上
  2. 如何在advice中編寫切面代碼

加強(advice)

定義:advice,由aspect添加到特定的Join point(符合pointcut規則的join point)的一段代碼。 許多AOP框架,包括Spring AOP,會將advice模擬爲一個攔截器(interceptor),而且在join point上維護多個advice,進行層層攔截。例如http鑑權的實現,咱們能夠爲每一個使用RequestMapping註解的方法織入advice,當http請求到來時,首先進入到advice代碼中,advice中咱們能夠分析http請求是否有相應的權限,若是有,則執行Controller,若是沒有,拋出異常。這裏的advice就扮演着鑑權攔截器的角色。代理

鏈接點(join point)

定義對象

a point during the execution of a program, such as the execution of a method or the handling of an exception. In Spring AOP, a join point always represents a method execution.接口

程序運行中的一些時間點,例如一個方法的執行,或者是一個異常的處理。 在Spring AOP中,join point老是方法的執行點,即只有方法鏈接點。圖片

切點(point cut)

定義:匹配Join point 的謂詞。 advice是和特定的point cut關聯的,而且在point cut相匹配的Join point中執行。開發

在Spring中,全部的方法均可以認爲是Join point,可是咱們並不但願在全部的方法上都添加advice,而point cut的做用就是提供一組規則(使用aspect pointcut expression language描述的)來匹配Join point,給知足規則的Joinpoint添加advice。

關於joinpoint(鏈接點)和pointcut(切點)的 區別

在Spring AOP中,全部的方法執行都是join point,而point cut是一個描述信息,它修飾的是join point,經過point cut,咱們就能夠肯定哪些join point能夠 被織入advice,所以join point 和point cut本質上就是兩個不一樣緯度上的東西。

advice,是在join point上執行的,而point cut是規定了哪些join point能夠執行哪些advice

目標對象(target)

定義:織入advice的目標對象。目標對象也被稱爲advised object。 由於Spring AOP使用運行時代理的方式來實現aspect,所以adviced object老是一個代理對象(proxied object)。注意,adviced object指的不是原來的類,而是織入advice後產生的代理類。

AOP proxy

一個類被AOP織入advice,就會產生一個結果類,它是融合了原類和加強邏輯的代理類。 在Spring AOP中,一個AOP代理是一個JDK動態代理對象或CGLIB代理對象。

織入(weaving)

將aspect和其餘對象鏈接起來,並建立adviced object的過程。

根據不一樣的實現技術,AOP織入有三種方式:

  • 編譯器織入,這要求有特殊的Java編譯器
  • 類裝載期織入,這須要有特殊的類加載器
  • 動態代理織入,在運行期爲目標類添加加強(Advice)生成子類的方式。 Spring採用動態代理織入方式,而Aspect採用編譯器織入類裝載期織入方式。

Advice類型

  • before advice,在join point前被執行的advice。雖然before advice是在join point前被執行,可是它並不能阻止join point的執行,除非發生了異常(即咱們在before advice代碼中,不能人爲地決定是否繼續執行join point中的代碼)
  • after return advice,在一個join point正常返回後執行的advice
  • after throwing advice,當一個join point拋出異常後執行的advice
  • after (final) advice,不管一個join point是正常退出仍是發生異常,都會被執行的advice
  • around advice,在join point前和join point退出後都執行的advice,這個是最經常使用的advice

關於 AOP proxy

Spring AOP默認使用標準的JDK動態代理(dynamic proxy)技術實現AOP代理,經過它,咱們能夠任意的接口實現代理。若是須要爲一個類實現代理,那麼可使用CGLIB代理。當一個業務邏輯對象沒有實現接口時,那麼Spring AOP就默認使用CGLIB來做爲AOP代理了。即若是咱們須要爲一個方法織入advice,可是這個方法不是一個接口所提供的方法,則此時Spring AOP會使用CGLIB來實現動態代理。鑑於此,Spring AOP建議基於接口編程,對接口進行AOP而不是類。

完全理解aspect,join point,point cut,advice

在Spring AOP中,join point指代的是全部方法的執行點,而point cut是一個描述信息,它修飾的是join point,經過point cut,咱們就能夠肯定哪些join point能夠被織入Advice。

  • join point,是全部可可能被織入advice的候選點,在Spring AOP中,則能夠認爲全部方法執行點都是join point。
  • point cut,Spring AOP中全部的方法(join point)均可以織入advice,可是咱們並不但願在全部方法上都織入advice,而point cut的做用就是提供一組規則來匹配join point,給知足規則的joinpoint添加advice。
  • advice,是一個動做,即一段java代碼,這段java代碼是做用於point cut所限定的那些join point上的。
  • aspect,是point cut和advice的組合。
  • advisor,用來定義只有一個通知和一個切入點的切面,要實現自定義的Advice,必須實現MethodInterceptor接口

或者從語法的角度來作一個不嚴謹的類比: joinpoint能夠認爲是一個賓語,而point cut則能夠類比爲修飾join point的定語,那麼整個aspect能夠描述爲知足pointcut規則的joinpoint會被添加相應的advice操做。

相關文章
相關標籤/搜索