1. 程式人生 > >基本概念:什麼是基於註解的切面實現

基本概念:什麼是基於註解的切面實現

在程式執行時,動態的將程式碼切入到類的指定方法、指定位置上的程式設計思想就是面向切面程式設計

一般而言,我們管切入到指定類指定方法的程式碼片段為切面,而切入的哪些類、哪些方法則叫切入點。有了AOP,我們就可以把幾個類共有的程式碼,抽取到一個切片中,等到需要時在切入物件中去,從而改變其原有的行為。

AOP就是OOP的補充而已。OOP從橫向上區分出一個個類來,而AOP則從縱向上向物件加入特定的程式碼。有了AOP,OOP變得立體了,如果加上時間維度,AOP使OOP從二維變成三維。

從技術上來說,AOP基本上是通過代理機制實現的。

經典的Spring AOP是基於動態代理技術的。在實現方式上,最常用的是實現MethodInterceptor介面來提供環繞通知,建立若干代理,然後使用ProxyBeanFactory配置工廠Bean,生成攔截器鏈,完成攔截。
 
我們通常使用註解的形式使用AOP


在xml中的配置

<context:component-scan base-package="demo.spring"/>
<aop:aspectj-autoproxy />

context:component-scan,使用@Component自動釋出bean,需要配置這個元素

aop:aspectj-autoproxy,使用@AspectJ及其它AOP註解需要配置,否則無法使用註解;

@AspectJ註解,將@Component自動釋出出來的"interceptor" bean轉換為一個aspectj切面,而@Pointcut、@Before、@After、@Around等註解,功能與在xml檔案中配置是一樣的;@Pointcut註解下面的方法內容無意義,只是要求一個相應方法提供註解依附。
註解只能使用在獲得的原始碼的場景,如果不能獲取原始碼,則只能通過xml配置的形式,將制定的物件配置成攔截器,對指定目標進行攔截;因此,通過xml檔案配置,而不是註解,是更加通用的方式。

除基礎的springframework框架的jar外,還需要依賴cglib、aspectj的jar包,maven配置如下:

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>2.2</version>
</dependency>
<dependency>
     <groupId>org.aspectj</groupId>
    <
artifactId
>
aspectjweaver</artifactId> <version>1.6.11</version> </dependency>

總結:Spring實現AOP,動態代理技術的兩種實現是jdk動態代理、cglib代理,根據被通知的方法是否為介面方法,來選擇使用哪種代理生成策略。
jdk動態代理:原理是實現介面的例項,攔截定於介面中的目標方法,效能更優,是spring生成代理的優先選擇
cglib代理:原理是使用cglib庫中的位元組碼動態生成技術,生成被代理類的子類例項,可以攔截代理類中的任一public方法的呼叫,無論目標方法是否定義與介面中,更通用,但效能相對jdk代理一些。