首页 > 代码库 > [原创]java WEB学习笔记106:Spring学习---AOP的通知 :前置通知,后置通知,返回通知,异常通知,环绕通知

[原创]java WEB学习笔记106:Spring学习---AOP的通知 :前置通知,后置通知,返回通知,异常通知,环绕通知

1.通知分类: 

 @Before: 前置通知, 在方法执行之前执行

 @After: 后置通知, 在方法执行之后执行

 @AfterRunning: 返回通知, 在方法返回结果之后执行

 @AfterThrowing: 异常通知, 在方法抛出异常之后

 @Around: 环绕通知, 围绕着方法执行

 

  关于方法签名 看第五点

 

2.前置通知

    技术分享

 

 

 

3.后置通知:在后置通知中,不能访问目标方法执行的结果

           技术分享

 

 

 

4.返回通知

             技术分享

         技术分享

 

5.异常通知

        技术分享

 

6.环绕通知

      技术分享

      技术分享

 

  1 package com.jason.spring.aop.impl;  2   3 import java.util.Arrays;  4 import java.util.List;  5   6 import org.aspectj.lang.JoinPoint;  7 import org.aspectj.lang.ProceedingJoinPoint;  8 import org.aspectj.lang.annotation.After;  9 import org.aspectj.lang.annotation.AfterReturning; 10 import org.aspectj.lang.annotation.AfterThrowing; 11 import org.aspectj.lang.annotation.Around; 12 import org.aspectj.lang.annotation.Aspect; 13 import org.aspectj.lang.annotation.Before; 14 import org.springframework.stereotype.Component; 15  16  17 //把这个类声明为一个切面 18 //1.需要将该类放入到IOC 容器中 19 @Component 20 //2.再声明为一个切面 21 @Aspect 22 public class LoggingAspect { 23      24     //声明该方法是一个前置通知:在目标方法开始之前执行 哪些类,哪些方法 25     //作用:@before 当调用目标方法,而目标方法与注解声明的方法相匹配的时候,aop框架会自动的为那个方法所在的类生成一个代理对象,在目标方法执行之前,执行注解的方法 26     //支持通配符 27     //@Before("execution(public int com.jason.spring.aop.impl.ArithmeticCaculatorImpl.*(int, int))") 28     @Before("execution(* com.jason.spring.aop.impl.*.*(int, int))") 29     public void beforeMethod(JoinPoint joinPoint){ 30         String methodName = joinPoint.getSignature().getName(); 31         List<Object> args = Arrays.asList(joinPoint.getArgs()); 32         System.out.println("The method " + methodName + " begins " + args); 33     } 34      35     /** 36      *  37      * @Author:jason_zhangz@163.com 38      * @Title: afterMethod  39      * @Time:2016年12月1日 40      * @Description:  在方法执行后执行的代码,无论该方法是否出现异常 41      * 42      * @param joinPoint 43      */ 44     @After("execution(* com.jason.spring.aop.impl.*.*(int, int))") 45     public void afterMethod(JoinPoint joinPoint){ 46         String methodName = joinPoint.getSignature().getName(); 47         List<Object> args = Arrays.asList(joinPoint.getArgs()); 48         System.out.println("The method " + methodName + " end " + args); 49     } 50      51     /** 52      *  53      * @Author:jason_zhangz@163.com 54      * @Title: afterReturning  55      * @Time:2016年12月1日 56      * @Description:  在方法正常结束后执行代码,放回通知是可以访问到方法的返回值 57      * 58      * @param joinPoint 59      */ 60     @AfterReturning( value="http://www.mamicode.com/execution(* com.jason.spring.aop.impl.*.*(..))", returning="result") 61     public void afterReturning(JoinPoint joinPoint ,Object result){ 62         String methodName = joinPoint.getSignature().getName(); 63         System.out.println("The method " + methodName + " end with " + result); 64     } 65      66     /** 67      *  68      * @Author:jason_zhangz@163.com 69      * @Title: afterThrowting  70      * @Time:2016年12月1日 71      * @Description:  在目标方法出现异常时会执行代码,可以访问到异常对象,且,可以指定出现特定异常时执行通知代码 72      * 73      * @param joinPoint 74      * @param ex 75      */ 76     @AfterThrowing(value="http://www.mamicode.com/execution(* com.jason.spring.aop.impl.*.*(..))",throwing="ex") 77     public void afterThrowting(JoinPoint joinPoint, Exception  ex){ 78         String methodName = joinPoint.getSignature().getName(); 79         System.out.println("The method " + methodName + " occurs exceptions " + ex); 80     } 81      82     /** 83      *  84      * @Author:jason_zhangz@163.com 85      * @Title: around  86      * @Time:2016年12月1日 87      * @Description: 环绕通知需要携带 ProceedingJoinPoint 类型的参数 88      *                    环绕通知 类似于  动态代理的全过程 89      *                   ProceedingJoinPoint:可以决定是否执行目标方法 90      *    环绕通知必须有返回值,返回值即为目标方法的返回值 91      *     92      * @param proceedingJoinPoint 93      */ 94     @Around("execution(* com.jason.spring.aop.impl.*.*(..))") 95     public Object around(ProceedingJoinPoint proceedingJoinPoint){ 96          97         Object result = null; 98         String methodName = proceedingJoinPoint.getSignature().getName(); 99         100         //执行目标方法101         try {102             //前置通知103             System.out.println("The method " + methodName + "begin with" + Arrays.asList(proceedingJoinPoint.getArgs()));104             105             result = proceedingJoinPoint.proceed();106             107             //后置通知108             System.out.println("The method " + methodName + "end with" + result);109             110         } catch (Throwable e) {111             //异常通知112             System.out.println("The method occurs exception : " + e);113             throw new RuntimeException();114         }115             //后置通知116             117         System.out.println("The method " + methodName + "end with" + result);118         119         return result;120         121     }122     123     124 }

 

    

 

[原创]java WEB学习笔记106:Spring学习---AOP的通知 :前置通知,后置通知,返回通知,异常通知,环绕通知