<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    瘋狂

    STANDING ON THE SHOULDERS OF GIANTS
    posts - 481, comments - 486, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    通過Annotation來實現AOP(轉)

    Posted on 2008-10-20 12:45 瘋狂 閱讀(2069) 評論(0)  編輯  收藏 所屬分類: java
    文章來源:http://jummy.javaeye.com/blog/255126,thank u,jummy。
     

    首先寫個題記吧 --- 如果你是 Spring 高手。那么我所寫的文章對你可能一文不值 ( 至少最近幾篇 ) ,就等于說讓你看小學課本 ( 本人水平也一般 ) ;如果你覺得你是個新手,希望這篇文章沒有浪費你的時間,讓你有所收獲!

    前兩篇文章一直不斷的在給 Spring AOP 做鋪墊。如果你剛接觸 AOP 不久還是希望你從 JDK 動態代理那篇文章一一看起,那也是我學習 AOP 的一個縮影。我覺得今天該寫寫所謂 Spring 中的 AOP 了,其實這并不是個什么新鮮事物只是 Spring 將它納入自己的框架取名曰: AOP( 面向切面編程 )

    Spring AOP 有兩種實現技術:一種不太用的是通過 Annotation( 注解 ) 實現。另一種方法就是通過配置文件來實現也就是我們的 configuration ,通過配置達到目的。 ( 這也是現在提倡的用法 ) 。但是為了理解原理,我還是從 Annotation 說起吧。懂了原理其他就好辦了。

    Annotation 方式實現 AOP ,首先得添加架包支持這兩個包就是: aspectjrt.jar aspectjweave.jar 。當然你還得添加一些其他的 Spring 支持。我們通過代碼來來講解吧

    因為是面向切面編程了,那知道橫切關注點了(假如我要實現安全驗證),那我們得將其抽取出來,模塊成一個類(也就是 AOP 的關鍵工作尋找切面 ,或者說自己創建切面 。這個是可以按需所求的,就是說你可以設計自己需要功能的切面)。那我就創建一個安全類吧:但為了體現面向接口編程的思想,我們想抽取成接口然后在通過接口的實現類來實現這一功能:

    創建接口:(這個是普通類的接口,也就是后面要使用切面的目標類的類接口)        

     
    1. package com.jummy.aop;   
    2.   
    3. public interface UserManager {   
    4.  public void  addUser(String string,String name);   
    5.  public void delUser(int id);   
    6.  public void modifyUser(int id,String name,int age);   
    7. }  
     

               

    接著是接口的實現類: ( 截圖比較模糊 ,我附有源碼的 )

     
    1. package com.jummy.aop;   
    2. public class UserManagerImpl implements UserManager {   
    3.   
    4.     public void addUser(String id, String name) {   
    5.        
    6.         System.out.println("---UsreManagerImpl中的addUser方法的實現-----");   
    7.     }   
    8.   
    9.     public void delUser(int id) {   
    10.         System.out.println("-----delUser方法的實現-----");   
    11.     }   
    12.   
    13.     public void modifyUser(int id, String name, int age) {   
    14.         System.out.println("----modifyUser方法的實現-----");   
    15.     }   
    16.   
    17. }  
     

     

    創建切面的接口:(所有的切面都可以從此接口繼承,這里這樣寫主要是體現面向接口編程的思想。這里提供實現安全驗證的接口)

           

     
    1. package com.jummy.aop;   
    2.   
    3. public interface MySecurityManager {   
    4.     public void security();   
    5.     //也可以添加多個方法   
    6.     //public void security2();   
    7. }  
     

     

    創建切面 ( ) :這是重點,除了實現接口中的方法以外,還需要在 Aspect 中定義 Pointcut 以及 Advice 。當然這一切是通過文章開頭說的 Aspectj 實現的,主要功能有兩個架包提供我們可直接引用( aspectjrt.jar aspectjweave.jar )!

     
    1. import org.aspectj.lang.annotation.Aspect;   
    2. import org.aspectj.lang.annotation.Before;   
    3. import org.aspectj.lang.annotation.Pointcut;   
    4. /*  
    5.  * 我們已經把橫切關注點抽取出來了  
    6.  * 那就需要定義我們的Aspect了(類)  
    7.  */  
    8. @Aspect  
    9. //使用@Aspect之前記得要引入aspectjrt.jar和aspectjweaver.jar   
    10. public class MySecurityManagerImpl implements MySecurityManager {   
    11.   
    12.     /*  
    13.      * 定義切入點,切入  
    14.      *   
    15.      * 該方法只是一個標識(而且只作為標識并不是常態下的方法,并不供人調用所以沒有返回值最好設置為private), 切入點的內容是一個表達式。  
    16.      * 根據這個表達式就可以用來判斷切入哪些對象的哪些方法  
    17.      */  
    18.     @Pointcut("execution(* add*(..))")   
    19.     /*  
    20.      * 下面對表達式簡單說一下: execution(* add*(..))第一個*說匹配是方法的任意返回值類型       
    21.      * 待會可以試驗一下。add*就是表示以add開頭的方法名都可以匹配想到正則表達式了嗎? (..)這兩個就是表示方法里所傳遞的參數類型也是任意匹配。  
    22.      * 具體的請參考spring的開發手冊, 這一點Spring講的比較清楚。  
    23.      *   
    24.      */  
    25.     private void addAllMethod() {   
    26.     }   
    27.   
    28.     /*  
    29.      * 定義Advice,標識在哪些切入點(切入點有ADD這是我們上面通過pointcut定義的。當然你也可以定義別的)  
    30.      * 的何處(何處就是指是切入點的前面呢?后面?還是其他情況)織入通知 當然除了before還有其他類型的通知。這里就不在累贅了  
    31.      *   
    32.      */  
    33.     @Before("addAllMethod()")   
    34.     public void security() {   
    35.         System.out.println("-----調用security方法-------");   
    36.     }   
    37.     /*這里也可以添加一些其他的前置方法  
    38.      * @Before("addAllMethod()")  
    39.     public void security2() {  
    40.         System.out.println("-----調用security方法2-------");  
    41.     }  
    42. */  
    43. }  
     

    所有原理我都注釋在源碼中。其中在 Aspect 中需要做的就是定義 Pointcut 以及 Advice 。在定義 Pointcut 的過程中我們需要注意幾點:首先在 Aspectj 的支持下, @Pointcut(“execution(* add*(..))”) 來實現。表達式我不多講了自己看 Spring 的手冊去吧。解釋代碼中 private void addAllMethod(){} 這是一個沒有返回值的空方法體,它程序的實際運行過程中并不執行 ( 同時我們也不希望它被其他人調用所以設置為 private 以權限控制 ) 。它只是一個標識,這個標識會被下面代碼中的 Advice( 也就是 @before(“addAllMethod()”) 調用。它的作用類似于變量名,起一個被調用的載體的作用 ( 所以稱為標識 ) ;當然切入點的內容 ( 也就是引號里的一些表達式 ) 它們起到的作用就是來描述我們要切入哪些對象的哪些方法。

      OK pointcut 我們定義完成輪到 Advice 了。 Advice 是通過 @before(“addAllMethod()”) 來定義的,當然你可以是 after/throws 等等其他類型的通知。代碼 public void security(){-------}

    這就是通知的具體方法實現,也就是我前面說的要添加的安全驗證。而且我申明了該驗證在我執行所有的以 add 開頭的方法之前執行。

       最后看看 spring 的配置文件里怎么寫吧。

    < aop:aspectj-autoproxy /> // 這里就是申明添加 aspectj 的支持,跟導入一個包類似的作用

    <!— 下面是切面的注入 -->

      < bean id = "mySecurityManagerImpl" class = "com.jummy.aop.MySecurityManagerImpl" ></ bean >

      <!-- 這是目標對象的注入 -->

      < bean id = "userManagerImpl" class = "com.jummy.aop.UserManagerImpl" ></ bean >         

    大家可能看到了,通過 Aspectj Annotation 支持實現 , 所有的 Advice Pointcut 啊都是直接在代碼中實現的 當然里面具體邏輯是 Spring 幫你通過代理來實現的,畢竟你自己的實現類中(如 UserManagerImpl 類中并沒有任何對安全性檢查的調用)

      

    主站蜘蛛池模板: 国产亚洲情侣久久精品| 亚洲色精品三区二区一区| 日韩免费在线中文字幕| 日本免费网站在线观看| 亚洲av日韩综合一区久热| 精品无码国产污污污免费| 老司机午夜在线视频免费观| 免费精品国产自产拍观看| 成人精品综合免费视频| 在线精品亚洲一区二区小说| 成人无码a级毛片免费| 亚洲伊人久久大香线蕉苏妲己| 精品无码无人网站免费视频| 亚洲沟沟美女亚洲沟沟| 免费中文熟妇在线影片| 春暖花开亚洲性无区一区二区| 亚洲乱亚洲乱少妇无码| 毛片在线播放免费观看| 亚洲午夜精品国产电影在线观看| 麻豆最新国产剧情AV原创免费 | 最新亚洲精品国偷自产在线| 好大好深好猛好爽视频免费| 美美女高清毛片视频黄的一免费| 亚洲综合伊人久久大杳蕉| 久久国产精品免费看| 亚洲色精品三区二区一区| 久久精品国产亚洲精品| 91热成人精品国产免费| 亚洲AV成人精品日韩一区| 亚洲人成网亚洲欧洲无码久久| 蜜桃视频在线观看免费视频网站WWW| 亚洲精品国产成人| 国产色爽免费视频| 午夜精品射精入后重之免费观看 | 亚洲aⅴ天堂av天堂无码麻豆| 国产综合亚洲专区在线| 桃子视频在线观看高清免费完整| 色妞www精品视频免费看| 亚洲国产精品高清久久久| AV免费网址在线观看| 亚洲一区二区三区免费|