久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    知識點七:Spring AOP技術

     pengx 2009-06-15
    Spring提供了兩種切面使用方式,實際工作中我們可以選用其中一種:
    1 基于xml配置方式進行AOP開發
    2 基于注解方式進行AOP開發


    下面是基于注解的方式
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www./schema/beans"
           xmlns:xsi="http://www./2001/XMLSchema-instance"
           xmlns:context="http://www./schema/context"
           xmlns:aop="http://www./schema/aop"     
           xsi:schemaLocation="http://www./schema/beans
               http://www./schema/beans/spring-beans-2.5.xsd
               http://www./schema/context http://www./schema/context/spring-context-2.5.xsd
               http://www./schema/aop http://www./schema/aop/spring-aop-2.5.xsd">
            <aop:aspectj-autoproxy/><!-- 啟動對@AspectJ注解的支持 -->
    </beans>



    Java代碼
    1. //@Aspect 表示此類是一個切面,包含切入點和通知   
    2. //@Component 表示將此切面交由spring容器管理,此時必須在配置文件里面開啟自動掃描   
    3. //  開啟自動掃描   <context:component-scan base-package="cn.itcast"/>   
    4. @Aspect  @Component  
    5. public class MyInterceptor {   
    6. //(1) 切入點的描述   
    7. /**  
    8.      *@Pointcut :表示規定切入點   
    9.      *execution() 語法規范  
    10.      * 第一個“*”表示任意返回結果類型  
    11.      * “cn.itcast.service.impl.PersonServiceBean”:表示對此類進行攔截,  
    12.      * 如果是cn.itcast.service..*.*:表示對包cn.itcast.service以及子包里所  
    13. 有的類的所有方法進行攔截,  
    14.      * (..)表示參數   
    15.      */    
    16. @Pointcut("execution(*    
    17. cn.itcast.service.impl.PersonServiceBean.*(..))")   
    18. //(2)聲明一個切入點   
    19. public void anyMethod(){}   
    20.        
    21. //(3) 聲明通知及注入方式   
    22. @Before("anyMethod()")   
    23. public void doAccessCheck(){   
    24.         System.out.println("前置通知");   
    25.     }   
    26. @AfterReturning("anyMethod()")   
    27.     public void doAfterReturning(){   
    28.         System.out.println("后置通知");   
    29.     }   
    30.     @After("anyMethod()")   
    31.     public void doAfter(){   
    32.         System.out.println("最終通知");   
    33.     }   
    34.     @AfterThrowing("anyMethod()")   
    35.     public void doAfterThrowing(){   
    36.         System.out.println("異常通知");   
    37.     }   
    38.     @Around("anyMethod()"//環繞通知的方法簽名是規定的!!!   
    39.     public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{   
    40.         //if(){適合判斷用戶權限   
    41.         System.out.println("進入方法");   
    42.         Object result = pjp.proceed();   
    43.         System.out.println("退出方法");   
    44.         //}   
    45.         return result;   
    46.     }      
    47. }  


    注冊給容器后,如果執行此切面規定攔截的類的方法時,按照@Before等方式加上“通知”

    得到的運行結果!!!!!一定注意順序
    前置通知
    進入方法
    我是save()方法
    后置通知
    最終通知
    退出方法
    ―――――――――――
    如果想在通知中得到攔截方法的參數,該怎么做?
    @Before("anyMethod() && args(name)")
    public void doAccessCheck(String name){
    System.out.println("前置通知");
    }
    注意:通知方法的參數名一定要和args指定的一致!!!

    如果想得到攔截方法的返回結果,該怎么做?


    Java代碼
    1. @AfterReturning(pointcut="anyMethod()",returning="result")   
    2. public void doAfterReturning(String result){   
    3.         System.out.println("后置通知:"+result);   
    4. }  



    如果想得到攔截方法拋出的異常,該怎么做?


    Java代碼
    1. @AfterThrowing(pointcut="anyMethod()",throwing="e")   
    2. public void doAfterThrowing(Exception e){   
    3.         System.out.println("異常通知:"+e);   
    4. }  


    基于xml配置方式進行AOP開發

    <aop:config>
        <aop:aspect id="asp" ref="myInterceptor">
                <aop:pointcut id="mycut"
    expression="execution(* cn.itcast.service..*.*(..))"/>
                <aop:before pointcut-ref="mycut" method="doAccessCheck"/>
                <aop:after pointcut-ref="mycut" method="doAfterReturning"/>
                <aop:after-returning pointcut-ref="mycut" method="doAfter"/>
                <aop:after-throwing
    pointcut-ref="mycut" method="doAfterThrowing"/>
                <aop:around pointcut-ref="mycut" method="doBasicProfiling"/>
              </aop:aspect>
        </aop:config>

    如果只是攔截返回值為String類型的方法,切面可以這樣寫
    <aop:pointcut id="mycut" expression="execution(java.lang.String
    cn.itcast.service..*.*(..))"/>
    如果要求第一個參數為String類型,不管其后面有幾個參數
    <aop:pointcut id="mycut" expression="execution(*
    cn.itcast.service..*.*(java.lang.String,..))"/>
    如果要求返回值類型不為void,怎么寫?           
    <aop:pointcut id="mycut" expression="execution(!void
    cn.itcast.service..*.*(..))"/>

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 日韩高清亚洲日韩精品一区二区| bt天堂新版中文在线| 伊人久久综合无码成人网| 深夜av在线免费观看| 国产欧美VA天堂在线观看视频| 国产精品自在线拍国产电影| 精品日韩人妻中文字幕| 国产成人MV视频在线观看| 久草热8精品视频在线观看| 好大好深好猛好爽视频| 亚洲AV永久无码精品主页| 国产午夜亚洲精品国产成人| 人人妻人人做人人爽| 综合色一色综合久久网| 精品无码人妻一区二区三区品 | 免费看成人毛片无码视频| 亚洲综合色婷婷六月丁香宅男大增| 国产稚嫩高中生呻吟激情在线视频| 国内精品久久久久影院优| 韩国无码AV片午夜福利| 精品少妇人妻AV无码久久| 女人18毛片水真多免费看| 成人AV无码一区二区三区| 中文字幕在线亚洲日韩6页| 精品无码久久久久久尤物| 好紧好湿好黄的视频| 亚洲色大成网站WWW永久麻豆| 日本丶国产丶欧美色综合| 欧美亚洲国产日韩一区二区| 起碰免费公开97在线视频| 免费人妻无码不卡中文字幕18禁 | 国产情侣激情在线对白| 亚洲AV无码成人网站手机观看| 国产99在线 | 免费| 亚洲人妻系列中文字幕| 国产欧美日韩A片免费软件| 第一亚洲中文久久精品无码| 东方av四虎在线观看| 午夜久久久久久禁播电影| 欧美人与动欧交视频| 中国CHINA体内裑精亚洲日本|