Spring入门知识 ———— 实现AOP返回通知、异常通知、环绕通知

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38111957/article/details/83717342

一、引言

以你为AOP只有前置通知和后置通知吗? 那你就错啦

在AOP中一共有五种方式:

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

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

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

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

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

先定义一个横切点:

 /**
     * 定一个Pointcut,此方法没有返回值和参数
     * 该方法就是一个标识,不进行调用
     *
     * execution中解释:
     * 第一个* :表示任意修饰符的方法
     * com.spring.two.UserMangeImpl.* : 具体的类下面全部的方法
     * (..):任意参数列表
     */
    @Pointcut("execution(* com.spring.two.UserMangeImpl.*(..))")
    public void beforLog(){}

二、返回通知

  /**
     * 方法正确返回时调用
     * returning 使用这个属性,指定接收的返回值
     * @param result
     */
    @AfterReturning(value = "beforLog()",returning ="result")
    public void insertLogAfterReturning(Object result){
        System.out.println("InsertLogHeadr.insertLogAfter 返回值-->" + result);
    }

三、异常通知


    /**
     * 方法发生异常之后
     * throwing 使用这个属性,可以指定某一个异常后执行
     */
    @AfterThrowing(value = "beforLog()",throwing = "ex")
    public void insertLogAfterThorwing(Exception ex){
        System.out.println("InsertLogHeadr.insertLogAfterThorwing");
    }

四、环绕通知

返回通知,和异常通知就没有什么好说的了。
           这个环绕通知,那我就还得说说说下。 环绕通知就相当于动态代理的全过程,看过小编之前讲动态代理实现的那个章节,可能有点印象。 注释上也说了,环绕通知需要携带一个参数,并且一定要有返回值

  /**
     * 环绕通知需要携带ProceedingJoinPoint类型参数
     * 环绕通知必须有返回值,返回值即为目标方法的返回值
     * @param joinPoint
     * @return
     */
    @Around("beforLog()")
    public Object insertLogAround(ProceedingJoinPoint joinPoint){

        Object result = null;

        try {
            //前置通知
            System.out.println("前置通知.......");

            //调用目标的方法
            result = joinPoint.proceed();

            //返回通知
            System.out.println("返回通知.......");
        } catch (Throwable e){
            e.printStackTrace();

            //异常通知
            System.out.println("异常通知.......");
        }

        //后置通知
        System.out.println("后置通知.......");
        return result;
    }

猜你喜欢

转载自blog.csdn.net/weixin_38111957/article/details/83717342