• Spring Aop之@Before、@After、@Around、@AfterReturning


    在项目中使用到了@Aspect注解,故研究了下与其配套的几个注解,将测试结果记录下来

    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    @Component
    @Aspect
    public class TestAspect {
    
        private static final Logger logger = LoggerFactory.getLogger(TestAspect.class);
    
        @Pointcut("execution(public * com.xwj.service..*.insert*(..))")
        private void recordLog() {
    
        }
    
        /**
         * 前置方法,在目标方法执行前执行
         * 
         * @param joinPoint
         */
        @Before("recordLog()")
        public void before(JoinPoint joinPoint) {
            logger.info("保存前方法:beforeSave");
        }
    
        /**
         * 后置方法,在目标方法执行后执行
         * 
         * @param joinPoint
         */
        @After("recordLog()")
        public void after(JoinPoint joinPoint) {
            logger.info("保存后方法:afterSave()");
        }
    
        @Around("recordLog()")
        public Object around(ProceedingJoinPoint joinPoint) {
            Object obj = null;
            try {
                logger.info("around前");
                joinPoint.proceed();
                logger.info("around后");
            } catch (Throwable e) {
                logger.info("aop异常");
            }
            return obj;
        }
    
        @AfterReturning(returning = "retObj", pointcut = "recordLog()")
        public void doAfterReturning(Object retObj) throws Throwable {
            // 处理完请求,返回内容
            logger.info("返回值 : " + retObj);
        }

    在上面代码中,@Pointcut注解中execution表达式的意思就是com.xwj.service包下的所有子类中的以insert为前缀的方法

    关于@Pointcut注解中,execution表达式的使用,可以参考AspectJ的切入点表达式---execution表达式详解

    发送请求,调用service中的insert方法,执行结果如下:

    2018-04-16 08:54:49.610  INFO 2308 --- [nio-8080-exec-3] com.xwj.aop.TestAspect                   : around前
    2018-04-16 08:54:49.610  INFO 2308 --- [nio-8080-exec-3] com.xwj.aop.TestAspect                   : 保存前方法:beforeSave
    2018-04-16 08:54:49.627  INFO 2308 --- [nio-8080-exec-3] com.xwj.aop.TestAspect                   : around后
    2018-04-16 08:54:49.627  INFO 2308 --- [nio-8080-exec-3] com.xwj.aop.TestAspect                   : 保存后方法:afterSave()
    2018-04-16 08:54:49.627  INFO 2308 --- [nio-8080-exec-3] com.xwj.aop.TestAspect                   : 返回值 : null

    通过打印出的结果可以看到,这几个注解的执行顺序:

      1、进入的是@Around中

      2、joinPoint.proceed()方法,进入到@Before

      3、@Before执行完后,又回到@Around

      4、@Around执行完后,进入到@After

      5、最后执行@AfterReturning

  • 相关阅读:
    Ubuntu18.04 Hadoop Standalone
    Shiro安全框架
    链表中环的的入口节点
    二维数组中的查找
    ElasticSearch快速入门
    logback日志配置
    RabbitMQ进阶笔记
    RabbitMQ入门笔记
    JUC-Lock锁及常用工具类
    Java中的线程池
  • 原文地址:https://www.cnblogs.com/xuwenjin/p/8853662.html
Copyright © 2020-2023  润新知