1. 程式人生 > >什麼是基於註解的切面實現?(AOP)

什麼是基於註解的切面實現?(AOP)

注:學習aop時查了其他資料,然後自己整合了一下。

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

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