爲了更好地應用AOP技術,技術專家們成立了AOP聯盟來探討AOP標準化。對應於現有的AOP實現方案,AOP聯盟對它們進行了必定程度的抽象,從而定義出AOP體系結構(以下圖所示)。結合這個體系結構去了解AOP技術,有助於理解AOP概念。 java
AOP聯盟定義的AOP體系結構把與AOP相關的概念大體分爲由高到低 、從使用到實現的三個層次。從上往下,最高層是語言和開發環境,在這個環境中能夠看到幾個重要的概念:express
在Spring AOP實現中,使用Java語言來實現加強對象與切面加強應用,併爲這二者的結合提供了配置環境。對於編織配置,毫無疑問,可使用Spring IoC容器來完成;對於POJO對象的配置,原本就是Spring核心IOC容器的強項。所以,對於使用Spring的AOP開發而言,使用POJO就能完成AOP任務。編程
aspect由pointcut和advice組成,它既包括了橫切邏輯的定義,也包括了鏈接點的定義。Spring AOP就是負責實施切面的框架,它將切面所定義的橫切邏輯織入到切面所指定的**鏈接點(join point)**中。app
AOP的工做重心在於如何將**加強(advice)織入目標對象的鏈接點(Join point)**上,這裏包含兩個工做:框架
定義:advice,由aspect添加到特定的Join point(符合pointcut規則的join point)的一段代碼。 許多AOP框架,包括Spring AOP,會將advice模擬爲一個攔截器(interceptor),而且在join point上維護多個advice,進行層層攔截。例如http鑑權的實現,咱們能夠爲每一個使用RequestMapping註解的方法織入advice,當http請求到來時,首先進入到advice代碼中,advice中咱們能夠分析http請求是否有相應的權限,若是有,則執行Controller,若是沒有,拋出異常。這裏的advice就扮演着鑑權攔截器的角色。代理
定義:對象
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老是方法的執行點,即只有方法鏈接點。圖片
定義:匹配Join point 的謂詞。 advice是和特定的point cut關聯的,而且在point cut相匹配的Join point中執行。開發
在Spring中,全部的方法均可以認爲是Join point,可是咱們並不但願在全部的方法上都添加advice,而point cut的做用就是提供一組規則(使用aspect pointcut expression language描述的)來匹配Join point,給知足規則的Joinpoint添加advice。
在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。
定義:織入advice的目標對象。目標對象也被稱爲advised object。 由於Spring AOP使用運行時代理的方式來實現aspect,所以adviced object老是一個代理對象(proxied object)。注意,adviced object指的不是原來的類,而是織入advice後產生的代理類。
一個類被AOP織入advice,就會產生一個結果類,它是融合了原類和加強邏輯的代理類。 在Spring AOP中,一個AOP代理是一個JDK動態代理對象或CGLIB代理對象。
將aspect和其餘對象鏈接起來,並建立adviced object的過程。
根據不一樣的實現技術,AOP織入有三種方式:
Spring AOP默認使用標準的JDK動態代理(dynamic proxy)技術實現AOP代理,經過它,咱們能夠任意的接口實現代理。若是須要爲一個類實現代理,那麼可使用CGLIB代理。當一個業務邏輯對象沒有實現接口時,那麼Spring AOP就默認使用CGLIB來做爲AOP代理了。即若是咱們須要爲一個方法織入advice,可是這個方法不是一個接口所提供的方法,則此時Spring AOP會使用CGLIB來實現動態代理。鑑於此,Spring AOP建議基於接口編程,對接口進行AOP而不是類。
在Spring AOP中,join point指代的是全部方法的執行點,而point cut是一個描述信息,它修飾的是join point,經過point cut,咱們就能夠肯定哪些join point能夠被織入Advice。
或者從語法的角度來作一個不嚴謹的類比: joinpoint能夠認爲是一個賓語,而point cut則能夠類比爲修飾join point的定語,那麼整個aspect能夠描述爲知足pointcut規則的joinpoint會被添加相應的advice操做。