1. 程式人生 > >Spring中的環繞通知

Spring中的環繞通知

Spring中的環繞通知:

1.概述
    問題:
        當我們配置了環繞通知之後,切入點方法沒有執行,而通知方法執行了
    分析:
        通過對比動態代理的環繞通知程式碼,發現動態代理的環繞通知有明確的切入點方法呼叫.而我們的沒有
    解決:
        Spring框架為我們提供了一個介面,proceedingJoinPoint.該介面有一個方法proceed()此方法就相當於明確呼叫切入點方法.
        該介面可以作為環繞通知的方法引數,在程式執行時,Spring框架會為我們提供該介面的實現類供我們使用

    Spring中的環繞通知:
    它是spring框架為我們提供的一種可以在程式碼中手動控制增強方法何時執行的方式

2. 使用
    2.1 基於註解:
        @Aspect
        public class AnnotationAudienceAround{

            //使用@Pointcut註解宣告切入點表示式
            @Pointcut("execution(* com.qin.util.*.*(..))")
            public void pt1(){}

            @Around("pt1()")
            public Object aroundPringLog(ProceedingJoinPoint pjp){
            Object rtValue = null;
            try{
                Object[] args = pjp.getArgs();//得到方法執行所需的引數

                System.out.println("Logger類中的aroundPringLog方法開始記錄日誌了。。。前置");

                rtValue = pjp.proceed(args);//明確呼叫業務層方法(切入點方法)

                System.out.println("Logger類中的aroundPringLog方法開始記錄日誌了。。。後置");

                return rtValue;
            }catch (Throwable t){
                System.out.println("Logger類中的aroundPringLog方法開始記錄日誌了。。。異常");
                throw new RuntimeException(t);
            }finally {
                System.out.println("Logger類中的aroundPringLog方法開始記錄日誌了。。。最終");
            }
            }
        }

    2.2 基於XML配置檔案:
        1. 通知類.
        //去掉了所有的註解
        public class XmlAudienceAround{

            public Object aroundPringLog(ProceedingJoinPoint pjp){
            Object rtValue = null;
            try{
                Object[] args = pjp.getArgs();//得到方法執行所需的引數

                System.out.println("Logger類中的aroundPringLog方法開始記錄日誌了。。。前置");

                rtValue = pjp.proceed(args);//明確呼叫業務層方法(切入點方法)

                System.out.println("Logger類中的aroundPringLog方法開始記錄日誌了。。。後置");

                return rtValue;
            }catch (Throwable t){
                System.out.println("Logger類中的aroundPringLog方法開始記錄日誌了。。。異常");
                throw new RuntimeException(t);
            }finally {
                System.out.println("Logger類中的aroundPringLog方法開始記錄日誌了。。。最終");
            }
            }
        }

        2. 在xml檔案中配置
            <!--宣告bean-->
            <bean name="xmlAudienceAround" class="com.qin.util.XmlAudienceAround"/>
            <!--配置切面及通知-->
            <aop:config>
            <aop:aspect ref="xmlAudienceAround">
                <aop:pointcut id="pt1" expression="execution(* com.qin.util.*.*(..))"/>
                <aop:around method="aroundPringLog" pointcut-ref="pt1"/>
            </aop:aspect>
            </aop:config>