当前位置: 首页 > news >正文

springboot中的AOP以及面向切面编程思想

快速入门体验AOP

aop中相关概念

实现导入依赖

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-aop</artifactId>  
</dependency>

新建aop文件夹,里面声明XXXAspect类 

@Aspect // 声明一个aop类
@Component
public class RecordTimeAspect {private static final Logger log = (Logger) LoggerFactory.getLogger(RecordTimeAspect.class);// 切入点表达式@Around("execution(* com.managerweb.service.ServiceImpl.*.*(..))") // 测试业务层的所有方法public Object RecordTime(ProceedingJoinPoint pjp) throws Throwable {long begin = System.currentTimeMillis();Object result = pjp.proceed(); // 这表示执行所有@Around里声明的方法long end = System.currentTimeMillis();// getSignature()获取方法名称log.info("方法{}运行时间为{}",pjp.getSignature(), (end - begin));return result;}
}

AOP的底层原理:动态代理

通知

根据通知方法执行时机的不同,将通知类型分为以下常见的五类:

  1. @Around: 环绕通知,此注解标注的通知方法在目标方法前、后都被执行
  2. @Before: 前置通知,此注解标注的通知方法在目标方法前被执行
  3. @After: 后置通知,此注解标注的通知方法在目标方法后被执行,无论是否有异常都会执行
  4. @AfterReturning: 返回后通知,此注解标注的通知方法在目标方法返回后执行,有异常不会执行
  5. @AfterThrowing: 异常后通知,此注解标注的通知方法发生异常时执行
     
  • 注意1:@Around环绕通知需要自己调用 ProceedingJoinPoint.proceed() 来让原始方法执行,其它通知不需要考虑目标方法执行
  • 注意2:@Around环绕通知方法的返回值,必须指定为Object,以接收目标方法的返回值。

抽取切入点表达式

抽取的原因:由于切入点表达式总是出现,为了简化,在最开始时将切入点表达式抽取出来

具体使用如下 

    @Pointcut("execution(* com.managerweb.service.ServiceImpl.*.*(..))")private void pt(){}@Around("pt()") // 测试业务层的所有方法public Object RecordTime(ProceedingJoinPoint pjp) throws Throwable {long begin = System.currentTimeMillis();Object resu
http://www.lryc.cn/news/507632.html

相关文章:

  • 降低Mobx技术债问题-React前端数据流方案调研整理
  • RabbitMQ消息可靠性保证机制7--可靠性分析-rabbitmq_tracing插件
  • SQL进阶技巧:如何求解直接线上最多的点数?
  • 【老白学 Java】泛型应用 - 卡拉 OK(四)
  • android studio更改应用图片,和应用名字。
  • SQL Server 表值函数使用示例
  • SpringBoot项目的创建方式
  • 微服务设计(第2版)读书笔记
  • idea无法识别文件,如何把floder文件恢复成model
  • vscode的keil assistant 中搜索不到全局变量
  • html+css网页设计 美食 餐饮杰12个页面
  • 重撸设计模式--代理模式
  • Redis性能调优:深入剖析变慢原因及应对策略
  • Python联合Halcon的详细教程
  • raid 状态查看 storcli64
  • 时间管理系统|Java|SSM|JSP|
  • 使用Docker启用MySQL8.0.11
  • Qt之修改窗口标题、图标以及自定义标题栏(九)
  • 每天40分玩转Django:Django测试
  • JS子页面调用父页面函数,监听刷新事件
  • Element@2.15.14-tree checkStrictly 状态实现父项联动子项,实现节点自定义编辑、新增、删除功能
  • 详细介绍如何使用rapidjson读取json文件
  • 【Qt】显示类控件:QLabel、QLCDNumber、QProgressBar、QCalendarWidget
  • 设计模式-访问者设计模式
  • Spring框架IOC
  • 有哪些免费的 ERP 软件可供选择?哪些 ERP 软件使用体验较好?
  • 思科CCNA认证都学什么考什么?
  • 模型部署学习笔记——模型部署关键知识点总结
  • 22智能 狄克斯特拉算法复习
  • 首个!艾灵参编的工业边缘计算国家标准正式发布