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

在程序運行時,動態的將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面編程

一般而言,我們管切入到指定類指定方法的代碼片段爲切面,而切入的哪些類、哪些方法則叫切入點。有了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代理一些。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章