zoukankan      html  css  js  c++  java
  • aop日志测试类

    https://blog.csdn.net/u010096717/article/details/82221263

    package com.leetcode.leetcode.aoptest;
    
    import lombok.extern.slf4j.Slf4j;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.springframework.stereotype.Component;
    
    /**
     * @description:
     * @author: licm
     * @create: 2021-08-17 15:59
     **/
    @Aspect
    @Component
    @Slf4j
    public class TestAspect {
    
        //com.kzj.kzj_rabbitmq.controller 包中所有的类的所有方法切面
        //@Pointcut("execution(public * com.kzj.kzj_rabbitmq.controller.*.*(..))")
    
        //只针对 MessageController 类切面
        //@Pointcut("execution(public * com.kzj.kzj_rabbitmq.controller.MessageController.*(..))")
    
        //统一切点,对com.kzj.kzj_rabbitmq.controller及其子包中所有的类的所有方法切面
        @Pointcut("execution(public * com.leetcode.leetcode.aoptest..*.*(..))")
        public void Pointcut() {
        }
    
        //前置通知
        @Before("Pointcut()")
        public void beforeMethod(JoinPoint joinPoint){
            log.info("调用了前置通知");
    
        }
    
        //@After: 后置通知
        @After("Pointcut()")
        public void afterMethod(JoinPoint joinPoint){
            log.info("调用了后置通知");
        }
        //@AfterRunning: 返回通知 rsult为返回内容
        @AfterReturning(value="Pointcut()",returning="result")
        public void afterReturningMethod(JoinPoint joinPoint,Object result){
            log.info("调用了返回通知");
        }
        //@AfterThrowing: 异常通知
        @AfterThrowing(value="Pointcut()",throwing="e")
        public void afterReturningMethod(JoinPoint joinPoint, Exception e){
            log.info("调用了异常通知");
        }
    
        //@Around:环绕通知
        @Around("Pointcut()")
        public Object Around(ProceedingJoinPoint pjp) throws Throwable {
            log.info("around执行方法之前");
            Object object = pjp.proceed();
            log.info("around执行方法之后--返回值:" +object);
            return object;
        }
    
    }
    
    

    测试

    package com.leetcode.leetcode.aoptest;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @description:
     * @author: licm
     * @create: 2021-08-17 15:37
     **/
    
    
    @RestController
    @Slf4j
    public class AopControllerTest {
    
        @GetMapping(value = "/send_message", produces = "text/json;charset=UTF-8")
        public String send_message(String str) throws Exception {
            log.info("执行了controller.send_message方法");
            System.out.println(str);
            return str;
        }
    
        @GetMapping(value = "/send_message1", produces = "text/json;charset=UTF-8")
        public String send_message1(String str) throws Exception {
            log.info("执行了controller.send_message方法");
            System.out.println(str);
            return str;
        }
    }
    
    
    

    这里可以获得更多方法参数

    
      //@Around:环绕通知
        @Around("Pointcut()")
        public Object Around(ProceedingJoinPoint joinPoint) throws Throwable {
            log.info("around执行方法之前");
            //获取方法签名
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            //获取切入方法的对象
            Method method = signature.getMethod();
    //        //获取方法上的Aop注解
    //        MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
    //        //获取注解上的值如 : @MyAnnotation(key = "'param id is ' + #id")
    //        String keyEl = annotation.key();
            //将注解的值中的El表达式部分进行替换
            //创建解析器
    //        SpelExpressionParser parser = new SpelExpressionParser();
    //        //获取表达式
    //        Expression expression = parser.parseExpression(keyEl);
            //设置解析上下文(有哪些占位符,以及每种占位符的值)
            EvaluationContext context = new StandardEvaluationContext();
            //获取参数值
            Object[] args = joinPoint.getArgs();
            //获取运行时参数的名称
            DefaultParameterNameDiscoverer discoverer = new DefaultParameterNameDiscoverer();
            String[] parameterNames = discoverer.getParameterNames(method);
            for (int i = 0; i < parameterNames.length; i++) {
                //这块是将参数名和参数注入,你可以考虑直接把他们放到map里
                context.setVariable(parameterNames[i], args[i].toString());
            }
            //解析,获取替换后的结果
    //        String result = expression.getValue(context).toString();
    
    //        System.out.println(result);
            return null;
        }
    
    不会,我可以学;落后,我可以追赶;跌倒,我可以站起来!
  • 相关阅读:
    Modified Mms.apkDiscontinued till I have free time
    文件管理器 Root Explorer v2.9.4 零售完全版
    QQREADEREFF8B4DFC3E8C03B
    CyanogenMod5 近乎完美的2.1ROM for G1 来了 感谢 cyanogen大神~~
    CyanogenMod5 Would you like a pony? (EXPERIMENTAL) [05/08 v5.0.7test3]
    商业周刊:摩托罗拉下注Android 不成功便成仁
    Cyanogen Updater 5.0 IS HERE!!!
    22个开源的PHP框架
    LotusPhp
    10 个免费超棒的编程用等宽字体
  • 原文地址:https://www.cnblogs.com/xiaoshahai/p/15152945.html
Copyright © 2011-2022 走看看