您好,登錄后才能下訂單哦!
直入主題,下面對AOP中幾個關鍵的術語進行簡單的說明
連接點是對程序執行過程中可被織入額外代碼的特定點的描述。連接點包含了兩個信息,一個是描述代碼中定義好的客觀存在事物的“位置”,例如某個類中的某個屬性、方法等。另一個是描述“位置”在執行過程中的某個時刻,例如:屬性的初始化前、屬性的初始化后、方法執行前、方法執行后等。
如果我們用代碼來描述,則可以像下面這樣
//方位描述對象
class Location{
//某對象【作用的對象】
String className ;
//執行點類型【屬性、方法等】
String type ;
//某執行點名稱【對應的屬性名、方法名等】
String name ;
//構造方法
public Location(String className,String type,String name){}
}
//執行點描述對象
class JoinPointDefined{
//方位
Location location ;
//執行時間點
String execTimePoint ;
//構造方法
public JoinPointDefined(Location location,String timePoint){}
}
class A{
String getName(){}
int getAge(){}
}
//執行點1
JoinPointDefined joinpoint1 = new JoinPointDefined(new Location("com.A",“method”,"getName"),"before") ;
//執行點2
JoinPointDefined joinpoint1 = new JoinPointDefined(new Location("com.A",“method”,"getName"),"after") ;
//執行點3
JoinPointDefined joinpoint2 = new JoinPointDefined(new Location("com.A",“method”,"getAge),"after") ;
//執行點N.....
對于不同的AOP實現框架,其能支持的連接點類型和運行時時刻也不盡相同,例如Spring AOP框架支持對方法在執行前、執行后、執行前后、拋出異常后等幾個時刻織入代碼。
以上面的類A為例,其中有兩個方法,假設Spring AOP框架只支持方法的執行前、執行后、拋出異常后的3個時刻,那么對Spring AOP而已其類A的執行點有 2*3 = 6 個 。
在實際的代碼中,我們一般都需要明確的指定在哪些方法上織入我們額外的代碼,那么如何來描述呢, 于是便有了切點(Pointcut)
切點用于明確指定連接點中的“方位”,如具體的哪些類中的哪些方法。切點就像SQL中的where條件,其目的就是使用類和方法作為篩選條件在眾多的連接點中篩選出滿足條件的。在Spring AOP中,切點通過org.springframework.aop.Pointcut接口描述。
通過切點我們篩選出了滿足條件的類型和方法,但該方法對應了多個連接點,為了進一步的刪選,我們還可以在篩選條件中加上“執行時刻”的信息。
在Spring AOP框架中使用Advice(增強)來描述“執行時刻”的信息。
增強除了描述“執行時刻”(方位)的信息外,同時還包含了我們在連接點上要織入的程序代碼。
在Spring AOP中,每個增強接口都各自代表了其方位信息,如:BeforeAdvice、AfterReturningAdvice等。
切面由切點(Pointcut)和增強(Advice)組成,它既包括橫切邏輯的定義,也包括連接點的定義。Spring AOP框架根據切面的定義來實施AOP的工作。可以理解為切面就是對切點和增強的引用。
Spring使用org.springframework.aop.Advisor接口表示切面的概念。在Spring AOP中切面分為 一般切面(Advisor)、切點切面(PointcutAdvisor)和引介切面(IntroductionAdvisor), 同時,切面都繼承自Advice。
1)普通切面:僅包含一個Advice,它代表的橫切的連接點事所有目標類的所有方法。
2)切點切面:具有切點的切面,包含Advice和Pontcut兩個類,這樣就可以通過類、方法名和方法方位等信息靈活的定義切面的連接點。
3)引介切面:它應用與類層面上,引介切點使用ClassFilter進行定義。
上面的“連接點”、“切點”和“增強”都是基于“類”在描述的,其定義的是某些類型中的某些方法上的某些預先定義的運行時刻,可以說他們都是靜態的描述信息。
但在程序的運行過程中,每個被切面篩選出的類都可能會被實例化成多個實例,而各個實例就是這里的目標對象,Spring AOP框架會在各個實例上運行織入的代碼【可能運行期動態加入執行邏輯,也可能編譯期直接織入到class文件中】。
就是將增強添加到目標類型的具體連接點上的過程。其實現的方法主要有以下三種
(1):編譯器織入,要求使用特殊的編譯器
(2):類裝載期織入,要求使用特殊的類裝載器
(3):動態代理織入
Spring使用動態大理織入,AspectJ采用編譯期和類裝載期織入。
它是一種特殊的增強,由于使用的不是很多,所以放在最后說明。通過引介這種特殊的增強,我們可以給類添加一些屬性和方法,例如讓某個類通過引介也實現某個接口并為該類添加接口的實現代碼。
Spring中的引介接口為:IntroductionInterceptor,Spring為該接口提供了實現類 DelegatingIntroductionInterceptor,一般情況下,我們只需要擴展該實現類就可以定義自己的引介增強類了。
在后面還是基于代碼逐步的對Spring AOP進行進一步的說明,包括各種實現方式。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。