• 21Spring重用切点表达式


    直接看代码:

    package com.cn.spring.aop.impl;
    //加减乘除的接口类
    public interface ArithmeticCalculator {
        int add(int i, int j);
        int sub(int i, int j);
        int mul(int i, int j);
        int div(int i, int j);
    }
    package com.cn.spring.aop.impl;
    
    import org.springframework.stereotype.Component;
    
    //实现类
    @Component
    public class ArithmeticCalculatorImpl implements ArithmeticCalculator {
        @Override
        public int add(int i, int j) {
            int result = i + j;
            return result;
        }
    
        @Override
        public int sub(int i, int j) {
            int result = i - j;
            return result;
        }
    
        @Override
        public int mul(int i, int j) {
            int result = i * j;
            return result;
        }
    
        @Override
        public int div(int i, int j) {
            int result = i / j;
            return result;
        }
    }
    package com.cn.spring.aop.impl;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.springframework.core.annotation.Order;
    import org.springframework.stereotype.Component;
    
    import java.util.Arrays;
    import java.util.List;
    
    //把这个类声明为一个切面:首先需要把该类放入到IOC容器中,在声明为一个切面
    //可以使用@order注解指定切面的优先级,值越小,优先级越高
    @Order(2)
    @Aspect
    @Component
    public class LoggingAspect {
    
        /**
         * 定义一个方法,用于声明切入点表达式,一般的,该方法中再不需要添入其他的代码
         * 使用@Pointcut来声明切入点表达式
         * 后面的其他通知直接使用方法名来引用当前的切入点表达式
         */
        @Pointcut(value = "execution(public int ArithmeticCalculator.*(..))")
        public void declareJoinPointExpression() {}
    
        //声明该方法是一个前置通知:在目标方法开始之前执行
        @Before("declareJoinPointExpression()")
        public void beforeMethod(JoinPoint joinPoint) {
            String methodName = joinPoint.getSignature().getName();
            List<Object> args = Arrays.asList(joinPoint.getArgs());
    
            System.out.println("The method " +  methodName + " begins with " + args);
        }
    
        //后置通知:在目标方法执行后(无论是否发生异常),执行的通知
        //在后置通知中还不能访问目标方法执行的结果
        @After("declareJoinPointExpression()")
        public void afterMethod(JoinPoint joinPoint) {
            String methodName = joinPoint.getSignature().getName();
            List<Object> args = Arrays.asList(joinPoint.getArgs());
    
            System.out.println("The method " +  methodName + " ends with " + args);
        }
    
        /**
         * 在方法正常结束后执行的代码
         * 返回通知是可以访问到方法的返回值
         * @param joinPoint
         */
        @AfterReturning(value = "declareJoinPointExpression()",
        returning = "result")
        public void afterReturning(JoinPoint joinPoint, Object result) {
            String methodName = joinPoint.getSignature().getName();
            List<Object> args = Arrays.asList(joinPoint.getArgs());
    
            System.out.println("The method  ends witd " + result);
        }
    
        //在目标方法出现异常时会执行的代码
        //可以访问到异常对象;且可以指定在出现特定异常时再执行通知代码
        @AfterThrowing(value = "declareJoinPointExpression()",
                throwing = "ex")
        public void afterReturning(JoinPoint joinPoint, Exception ex) {
            String methodName = joinPoint.getSignature().getName();
    
            System.out.println("The method " +  methodName + " occures exception with: " + ex);
        }
    
        /**
         * 环绕通知需要携带ProceedingJoinPoint类型的参数
         * 环绕通知类似于动态代理的全过程:ProceedingJoinPoint类型的参数可以决定是否执行目标方法
         * 且环绕通知必须有返回值,返回值为目标方法的返回值
         * @param proceedingJoinPoint
         */
        @Around("declareJoinPointExpression()")
        public Object aroundMethod(ProceedingJoinPoint proceedingJoinPoint) {
            Object result = null;
            String methodName = proceedingJoinPoint.getSignature().getName();
            //执行目标方法
            try {
                //前置通知
                System.out.println("The method " +  methodName + " begins with " + Arrays.asList(proceedingJoinPoint.getArgs()));
                result = proceedingJoinPoint.proceed();
                //返回通知
                System.out.println("The method ends with " + result);
            } catch (Throwable throwable) {
                //异常通知
                System.out.println("The method " +  methodName + " occures exception with: " + throwable);
                throw new RuntimeException(throwable);
            }
            //后置通知
            System.out.println("The method " +  methodName + " ends");
            return result;
        }
    }
    package com.cn.spring.aop.impl;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.springframework.core.annotation.Order;
    import org.springframework.stereotype.Component;
    
    import java.util.Arrays;
    
    @Order(1)
    @Aspect
    @Component
    public class ValidationAspect {
    
        @Before("LoggingAspect.declareJoinPointExpression()")//重用切点表达式
        public void validateArgs(JoinPoint joinPoint) {
            System.out.println("validate:" + Arrays.asList(joinPoint.getArgs()));
        }
    }
    package com.cn.spring.aop.impl;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Main {
        public static void main(String[] args) {
            //1.创建Spring的IOC容器
            ApplicationContext ctx = new ClassPathXmlApplicationContext("17-1.xml");
    
            //2.从IOC容器中huo获取bean的实例
            ArithmeticCalculator arithmeticCalculator = ctx.getBean(ArithmeticCalculator.class);
    
            //3.使用bean
            int result = arithmeticCalculator.add(3, 6);
    
    
    
            System.out.println("result:" + result);
            //result = arithmeticCalculator.div(3, 0);
           // System.out.println("result:" + result);
        }
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
        <context:component-scan base-package="com.cn.spring.aop.impl">
        </context:component-scan>
    
        <!--使AspjectJ注解起作用:自动为匹配的类生成代理对象-->
        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    </beans>
  • 相关阅读:
    bnuoj 4207 台风(模拟题)
    bnuoj 4208 Bubble sort
    bnuoj 4209 Triangle(计算几何)
    bnuoj 33656 J. C.S.I.: P15(图形搜索题)
    bnuoj 33648 Neurotic Network(树形模拟题)
    bnuoj 33647 Angry Grammar Nazi(字符串)
    bnuoj 16493 Just Pour the Water(矩阵快速幂)
    Solidity合约记录——(三)如何在合约中对操作进行权限控制
    预赛第二场
    预赛第一场
  • 原文地址:https://www.cnblogs.com/jecyhw/p/4596059.html
Copyright © 2020-2023  润新知