spring框架中AOP思想與各種配置詳解


Spring中提供兩種AOP支持:

  1.基於代理的經典AOP

  2.Aspectj注解配置AOP

  

  首先我們先了解什么是AOP,AOP(Aspect Oriented Programming)面向切面編程!AOP采用了橫向抽取機制(可能有人會說啥叫橫向抽取機制,在這里先引入一個縱向繼承的概念),取代了縱向繼承的重復性代碼(例如權限控制、性能監視、緩存)

  spring AOP使用純Java實現,主要通過代理方式向目標類(被代理的類織入增強代碼)

  Aspectj 是一個基於Java語言的AOP框架

  縱向繼承

                                     在圖中,左邊的傳統的縱向繼承方式,因為writelog在具體實現類userdao中無法被復用,所以此方法就被放到了所有的dao的父類BaseDao中

                                     多態的特性,所有子類dao要加強代碼時,經過父類的writelog方法,類似一種從上到下的關系;然而右邊的是AOP思想下的代碼增強,因為不

                                     論是代理類UserDaoProxy,還是被代理類UserDao,都實現了同一個接口或是同一個父類,屬於兄弟關系,實現了所謂的“橫向”的切入機制!

而對於AOP中的一些術語,我覺得你們需要了解一下,以便於對下面的閱讀有幫助!

針對這個圖再補充一下,一個切點和一個advice的組合叫advisor!!

 

(1) 基於代理的經典AOP

  通知:advice

  Spring提供了 前置通知、環繞通知、后置通知、異常通知等等。

  這些advice分別對應要實現的接口:MethodBeforeAdvice、MethodInteceptor、AfterReturningAdvice、ThrowsAdvice

  就拿前置通知來舉例子:

            

 這是在xml中的各個類的配置

      

   但其實你們會發現,我這里的advice沒有指定要對哪個方法執行增強,因為dao可能會有好幾種方法,但是有些並不需要增強,所以一,我們就需要一個帶有特定切點的advice

基於以上的配置進行修改,帶有切點的切面!!

  

  一個切點和一個advice的組合:advisor

  帶有切點的切面,只需要在以上配置中再加一個:

      之后在配置代理類時,把interceptorname換位這個帶有切點的切面id

   但是有沒有發現前面的配置中,每一步生成代理類時,都需要主動去配置proxyFactoryBean來生成代理類,這樣做很麻煩,所以這里又要引入自動代理的概念!!

        

         

 

          

      (2) Aspectj配置AOP(推薦使用)

     

    2.1基於Aspectj注解形式

    第一步:引入相應的jar包

      

     第二步:以Aspectj形式編寫

     

     第三步:創建xml文檔:

     

   2.2基於Aspectj的xml形式配置

     這是以xml形式編寫的aspect配置

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM