美文网首页
Spring--AOP

Spring--AOP

作者: 何以解君愁 | 来源:发表于2022-08-14 15:28 被阅读0次
    切面类和目标类都需要交给IOC容器
    @Aspect:将当前主键标识为切面
    <aop:aspectj-autoproxy/>:开启基于注解的AOP
    
    @Before("execution(* 包名.类名.*(..))"):将方法标识为前置方法,在目标代码执行之前执行,例@Before("execution(* com.Test.calculatorImpl.*(..))")
    (第一个*表任意修饰符和返回值类型,第二个*表类中所有的方法,..表示任意的方法中的任意的参数列表,类名也可写*,表当前包下的所有类,联想一下正则)
    
    在@Before下的通知方法下设置参数JoinPoint joinPoint可获取连接点的信息:
            //获取连接点的方法的签名信息(声明信息)
            Signature signature = joinPoint.getSignature();
            //获取连接点所对应方法的参数
            Object[] args = joinPoint.getArgs();
    
    //切入点表达式重用
    //@Pointcut设置之后@Before("execution(* 包名.类名.*(..))")可直接使用@Before("pointcut()")
    @Pointcut("execution(* com.Test.calculatorImpl.*(..))")
     public void pointcut(){}
    
    @After("pointcut()")将方法标识为后置方法,在目标代码的Finally语句中执行
    
    @AfterReturning:返回通知,在目标对象方法返回值之后执行
    returning = "result":设置返回值
        @AfterReturning(value = "pointcut()", returning = "result")
        public void afterReturningAdviceAethod(JoinPoint joinPoint, Object result) {
            //获取连接点所对应方法的签名信息
            Signature signature = joinPoint.getSignature();
            System.out.println(result);
        }
    
    @AfterThrowing:异常通知
    @AfterThrowing(value = "pointcut()", throwing = "ex")
        public void afterReturningAdviceAethod(JoinPoint joinPoint, Exception ex) {
            //获取连接点所对应方法的签名信息
            Signature signature = joinPoint.getSignature();
            System.out.println(signature.getName()+ex);
        }
    
    @Around:环绕通知(环绕通知方法的返回值一定要和目标对象的方法的返回值一致)
    @Around("pointcut()")
        public Object aroundAdviceMethod(ProceedingJoinPoint proceedingJoinPoint){
            Object proceed = null;
            try {
                System.out.println("前置");
                //表示目标对象方法的执行
                proceed = proceedingJoinPoint.proceed();
                System.out.println("返回");
            } catch (Throwable e) {
                e.printStackTrace();
                System.out.println("异常");
            }finally {
                System.out.println("后置");
            }
            return proceed;
        }
    
    @Order:设置它的value设置切面的优先级,设置的数越小,优先级越高,如@Order(1),写于@Aspect下
    

    相关文章

      网友评论

          本文标题:Spring--AOP

          本文链接:https://www.haomeiwen.com/subject/trxfgrtx.html