在项目中使用到了@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方法,执行结果如下:

-- ::49.610  INFO  --- [nio--exec-] com.xwj.aop.TestAspect                   : around前
-- ::49.610 INFO --- [nio--exec-] com.xwj.aop.TestAspect : 保存前方法:beforeSave
-- ::49.627 INFO --- [nio--exec-] com.xwj.aop.TestAspect : around后
-- ::49.627 INFO --- [nio--exec-] com.xwj.aop.TestAspect : 保存后方法:afterSave()
-- ::49.627 INFO --- [nio--exec-] com.xwj.aop.TestAspect : 返回值 : null

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

  1、进入的是@Around中

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

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

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

  5、最后执行@AfterReturning

最新文章

  1. cat -n与nl的区别
  2. 动手动脑及java程序之用消息框进行数的运算
  3. [Chapter 3 Process]Practice 3.12 Including the initial parent process, how many processes are created by the program shown in Figure 3.32?
  4. [Asp.net mvc]实体更新异常:存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。
  5. [转]linux之more命令
  6. Python基础 初识Python
  7. websphere内存溢出,手动导出was的phd和javacore文件
  8. 【剑指offer】面试题34:丑数
  9. Android UI ActionBar功能-自动隐藏 Action Bar
  10. ES6的十大特性和认知
  11. ubuntu18.04 配置chrome ss
  12. Linux CFS调度器之虚拟时钟vruntime与调度延迟--Linux进程的管理与调度(二十六)
  13. 【python小练】0014题 和 0015 题
  14. POJ 3122 Pie【二分答案】
  15. dijkstra 的优先队列优化
  16. 事件委托(event delegation) 或叫 事件代理
  17. hanlp源码解析之中文分词算法详解
  18. iPhone 获取指定格式的时间和日期
  19. hdu 4930 斗地主恶心模拟
  20. BZOJ1071: [SCOI2007]组队【双指针】【思维好题】

热门文章

  1. 【Kindeditor编辑器】 文件上传、空间管理
  2. VisualStudio神级插件Resharper的基本配置和使用技巧大全+Resharper性能优化
  3. C#委托总结-匿名方法&Lambda表达式
  4. SQLite 编译错误 - 试图加载格式不正确的程序
  5. WPF 图片抗锯齿,尤其是小图片更为严重
  6. event 自定义事件
  7. const的详解
  8. jzoj5832. 【省选模拟8.20】Emotional Flutter
  9. Youke365_2_4 一处Sql注入漏洞以及一处任意文件删除
  10. Ubuntu 16.04下安装Apache压力测试工具ab