Spring AOP(概念,使用)

目录

  • Spring AOP
    • AOP是什么
    • 什么是Spring AOP
    • AOP实际开发流程
      • 1. 引入依赖
      • 2. 编写AOP程序
    • Spring AOP详解
      • Spring AOP中的核心概念
      • Spring AOP的通知类型
        • 六种类型
        • @PointCut
        • @Order(切面优先级)

Spring AOP

AOP是什么

  • Aspect Oriented Programminig(面向切面编程)
  • 切面指的是某一类特定问题,比如说登录拦截器,就是对“登录校验”,这一类问题的统一处理
  • 所以,拦截器是AOP的一种应用
  • AOP是一种思想,是对某一类事情的集中处理

什么是Spring AOP

  • AOP是一种思想,它的实现方法有很多,有Spring AOP,也有AspectJ ,CGLIB等。

业务的复杂
AOP可以做到在不改动这些原始方法的基础上,针对特定的方法进行功能的增强
AOP的作用:在程序运行期间在不修改源代码的基础上,对已有的方法进行增强(无侵入性:解耦)

AOP实际开发流程

1. 引入依赖

在pom.xml文件中添加配置

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

2. 编写AOP程序

业务:记录Controller中每个方法的执行时间

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Slf4j
@Aspect
@Component
public class TimeAspect {
 /**
 * 记录⽅法耗时
 */
 @Around("execution(* com.example.demo.controller.*.*(..))")
 	public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {
 //记录⽅法执⾏开始时间
 		long begin = System.currentTimeMillis();
 //执⾏原始⽅法
		 Object result = pjp.proceed();
 //记录⽅法执⾏结束时间
 		long end = System.currentTimeMillis();
 //记录⽅法执⾏耗时
		 log.info(pjp.getSignature() + "执⾏耗时: {}ms", end - begin);
 return result;
 }
}

在这里插入图片描述

Spring AOP详解

在这里插入图片描述

  1. @Aspect: 标识这是一个切面类
  2. @Around:环绕通知,在目标方法执行前后都会被执行。
  3. ProceedingJoinPoint.proceed() 让原始方法执行

Spring AOP中的核心概念

  1. 切点(Pointcut)
    提供一组规则,告诉程序对哪些方法来进行增强

在这里插入图片描述

  1. 连接点
    满足切点表达式规则的方法
    例如
    切点表达式:英雄联盟全部射手
    连接点:希维尔,艾希等各个射手

  2. 通知(Advice)
    具体要做的工作
    在这里插入图片描述

  3. 切面(Aspect)
    切面 = 切点 + 通知
    切面所在的类,一般称为切面类

Spring AOP的通知类型

六种类型

上⾯我们讲了什么是通知, 接下来学习通知的类型. @Around 就是其中⼀种通知类型, 表⽰环绕通知.
Spring中AOP的通知类型有以下⼏种:
• @Around: 环绕通知, 此注解标注的通知⽅法在⽬标⽅法前, 后都被执⾏
• @Before: 前置通知, 此注解标注的通知⽅法在⽬标⽅法前被执⾏
• @After: 后置通知, 此注解标注的通知⽅法在⽬标⽅法后被执⾏, ⽆论是否有异常都会执⾏
• @AfterReturning: 返回后通知, 此注解标注的通知⽅法在⽬标⽅法后被执⾏, 有异常不会执⾏
• @AfterThrowing: 异常后通知, 此注解标注的通知⽅法发⽣异常后执⾏

程序发生异常的情况下:

  1. @AfterReturning 标识的通知方法不会执行,@AfterThrowing 标识的通知方法执行
  2. @Around环绕通知中原始方法调用时有异常,通知中的环绕后的代码逻辑也不会在执行了

在这里插入图片描述

注意事项

  1. 环绕通知⽅法的返回值, 必须指定为Object, 来接收原始⽅法的返回值, 否则原始⽅法执⾏完毕, 是获取不到返回值的.
  2. @Around 环绕通知需要调用ProceedingJoinPoint.proceed() 来让原始⽅法执⾏, 其他通知不需要考虑⽬标⽅法执⾏.
  3. 一个切面类可以用多个切点
@PointCut

上⾯代码存在⼀个问题, 就是存在⼤量重复的切点表达式 execution(* com.example.demo.controller..(…)) , Spring提供了 @PointCut 注解, 把公共的切点表达式提取出来, 需要⽤到时引⽤该切⼊点表达式即可.
上述代码就可以修改为:

@Aspect
@Component
public class AspectDemo {
 //定义切点(公共的切点表达式)
 @Pointcut("execution(* com.example.demo.controller.*.*(..))")
 private void pt(){}
 //前置通知
 @Before("pt()")
 public void doBefore() {
 //...代码省略
 }
 //后置通知
 @After("pt()")
 public void doAfter() {
 //...代码省略
 }
 //返回后通知
 @AfterReturning("pt()")
 public void doAfterReturning() {
 //...代码省略
 }
 //抛出异常后通知
 @AfterThrowing("pt()")
 public void doAfterThrowing() {
 //...代码省略
 }
 //添加环绕通知
 @Around("pt()")
 public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
 //...代码省略
 }
}
@Order(切面优先级)

存在多个切⾯类时, 默认按照切⾯类的类名字⺟排序:
• @Before 通知:字⺟排名靠前的先执⾏
• @After 通知:字⺟排名靠前的后执⾏
但这种⽅式不⽅便管理, 我们的类名更多还是具备⼀定含义的.
Spring 给我们提供了⼀个新的注解, 来控制这些切⾯通知的执⾏顺序: @Order

该注解标识的切⾯类, 执⾏顺序如下:
• @Before 通知:数字越⼩先执⾏
• @After 通知:数字越⼤先执⾏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/627674.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信息管理系统升级改造项目:需求分析工具与实践

关键词&#xff1a;出入境信息管理系统、升级改造项目、需求分析实践、逆向工程、PowerDesigner、Axure Pro、信息系统优化策略 文章重点&#xff1a;本文以出入境信息管理系统的升级改造项目为背景&#xff0c;详细阐述了信息系统需求分析的实践过程&#xff0c;特别是如何通过…

海外媒体宣发:新加坡.马来西亚如何在海外媒体投放新闻通稿-大舍传媒

导言 随着全球化的进程加速&#xff0c;海外市场对于企业的发展越来越重要。而在海外媒体上宣传企业的新闻通稿&#xff0c;成为了拓展海外市场和提升企业知名度的重要手段之一。本文将介绍大舍传媒对于如何在海外媒体上投放新闻通稿的经验和策略。 准备工作&#xff1a;了解…

学习注意力机制并将其应用到网络中

什么是注意力机制 注意力机制的核心重点就是让网络关注到它更需要关注的地方。 当我们使用卷积神经网络去处理图片的时候&#xff0c;我们会更希望卷积神经网络去注意应该注意的地方&#xff0c;而不是什么都关注&#xff0c;我们不可能手动去调节需要注意的地方&#xff0c;…

OpenAI 推出 GPT-4o:实现多模态 AI 交互

一、前言 OpenAI 推出了其最新的 AI 模型——GPT-4o&#xff0c;此次发布的并非 GPT-4.5 或 GPT-5&#xff0c;而是一款全新的“全模态模型(Omnimodel)”。这是一个将文本、语音和视觉能力集成到单一无缝 AI 体验中的突破性发展。 GPT-4o 于 2024 年 5 月 14 日发布&#xff0…

北京玻色量子携手赛氪网举办长三角高校数学建模竞赛巡回讲座

2024年5月13日下午&#xff0c;一场聚焦数学建模与量子计算前沿的讲座在中国计量大学隆重举行。此次讲座作为第四届长三角高校数学建模竞赛的巡回宣讲活动之一&#xff0c;由北京玻色量子科技有限公司与竞赛组委会成员赛氪网共同举办&#xff0c;旨在向广大师生介绍量子计算的应…

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第六套

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第六套 部分题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09;&#xff08;共十套&#xff0c;每套四十题选择题&#xff09;获取&#xff08;WX:…

渣土车上路识别报警摄像机

随着城市建设的不断推进&#xff0c;渣土车在城市道路上的数量也逐渐增加。然而&#xff0c;一些不法渣土车司机往往会超载、超速行驶或者闯红灯&#xff0c;给道路交通安全和城市环境带来了一定的隐患。为了有效监管渣土车上路行驶的情况&#xff0c;渣土车上路识别报警摄像机…

如何从集装箱的标准化启发软件的模块化设计?

目录 一、集装箱的历史发展 1、早期设想与萌芽 2、英国铁路初步应用 3、美欧多国发展 4、国际组织推动 5、海运集装箱兴起 6、标准化进程加速 7、联运格局形成 8、后续发展与影响 二、集装箱的标准化意义 三、集装箱的标准化与软件设计的模块化 1、集装箱标准化 2…

数字化校园与院校通的关系

数字化校园是以数字化信息和网络为根底&#xff0c;在计算机和网络技术上建立起来的对教育、科研、办理、技术服务、生活服务等校园信息的搜集、处理、整合、存储、传输和运用&#xff0c;使数字资源得到充沛优化运用的一种虚拟教育环境。经过完成从环境&#xff08;包含设备&a…

USB3.0接口——(2)数据结构

1.数据结构 在 USB 3.0 及更高版本的 xHCI 协议中&#xff0c;“Rings”、“Transfer Request Block (TRB)” 和 “Transfer Descriptor (TD)” 是用于管理 USB 数据传输和事件的重要概念。 1.1.Rings Rings是指一种数据结构&#xff0c;用于组织和管理 USB 数据传输和事件。…

pdfMake,xlsx-js-style,elementTable表格导出大量数据的pdf和xslx表格

使用渲染dom传递给xlsx或将dom转canvas在传给jspdf数据量大都会造成页面负载过大 所以导pdf和xlsx都使用数据传递给pdfMake,xlsx-js-style&#xff0c;pdf涉及分页与合并单元格 一.pdf npm并引入pdfMake和其字体包&#xff08;记录时使用版本0.2.10 import pdfMake from &qu…

【系统架构师】-案例篇(十二)MQTT、边缘计算与缓存一致性

1、MQTT是一个基于物联网的传输协议&#xff0c;用于轻量级的订阅发布的消息传输。旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。 开放消息协议&#xff0c;简单易实现发布订阅模式&#xff0c;一对多消息发布基于TCP/IP网络连接,提供有序&#xff0c;无损…

【Vue开发】基于SSM++jsp的精品酒销售管理系统【源码+lw+部署文档+讲解】

目录 第一章 绪 论 第二章 关键技术的研究 2.1 JSP技术介绍 2.2 JAVA简介 2.3 ECLIPSE 开发环境 2.4 Tomcat服务器 2.5 MySQL数据库 第三章 系统分析 3.1 系统设计目标 3.2 系统可行性分析 3.3 系统功能分析和描述 3.4系统UML用例分析 3.4.1管理员用例 3.4.2用户用例 3.5系统流…

提升效率! 宏集助力客户实现仓储和物流系统的智能化改造

前言 在现代物流与仓储管理领域&#xff0c;自动存储和检索系统已日益普及&#xff0c;堆垛机和物流小车组合的仓储系统成为高效、精确存储和取货货物的关键。随着技术的进步&#xff0c;堆垛机的定位技术也在不断优化。传统堆垛机采用机械装置和导轨上的光电开关进行定位&…

成都欣丰洪泰文化传媒有限公司电商服务新典范

在数字化浪潮席卷而来的今天&#xff0c;电商行业作为新时代商业发展的重要引擎&#xff0c;正以其独特的魅力和无限潜力&#xff0c;吸引着越来越多的企业和个人投身其中。在这个充满机遇与挑战的领域中&#xff0c;成都欣丰洪泰文化传媒有限公司以其专业的电商服务&#xff0…

CTF如何学习?

CTF如何学习&#xff1f;打CTF有什么用 CTF本身有几个常见的领域 MISC WEB [逆向 密码学](https://www.zhihu.com/search?q逆向 密码学&search_sourceEntity&hybrid_search_sourceEntity&hybrid_search_extra{“sourceType”%3A"answer"%2C"sourc…

yolov8添加FPPI评价指标

这里写自定义目录标题 yolov8 中FPPI实现测试中调用 效果结语 续yolov7添加FPPI评价指标 。之前在yolov7中增加了fppi指标&#xff0c;有不少网友问有没有yolov8中增加&#xff0c;最近没有做算法训练&#xff0c;也一直没时间弄。这几天晚上抽了点时间&#xff0c;弄了一下。不…

Vue3 - 项目配置多环境配置文件

最常见的多环境配置,就是开发环境配置,和生产环境配置(也就是上线的配置),很多情况下我们开发环境下的域名,和一些配置项,和我们生产模式下的不同,这个时候就需要我们进行多环境配置,不然每次发版都要改一波数据多麻烦。 另一种情况就是你两个项目是用的一套代码,但是最…

一文全解聚碳酸酯PC材料在汽车灯罩制造中的诸多显著优势!汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

聚碳酸酯PC材料在汽车灯罩制造中具有诸多显著优势。除了优异的抗冲击性、透明性、耐热性和稳定性外&#xff0c;还有以下一些重要优势&#xff1a; 出色的光学性能&#xff1a;PC材料的光学性能优异&#xff0c;能够确保灯罩内的光源均匀分布&#xff0c;减少光斑和眩光&#…

新人学习笔记值(初始JavaScript)

一、Java Script是什么 1.Java Script是世界上最流行的语言之一&#xff0c;是一种运行在客户端的脚本语言&#xff08;script是脚本的意思&#xff09; 2.脚本语言&#xff1a;不需要编译&#xff0c;运行过程中由js解释器&#xff08;js引擎&#xff09;进行解释并运行 3.现在…