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 通知:数字越⼤先执⾏

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oceanbase 4.3特性解析:用物化视图来优化复杂查询

如果你是一位数据分析师&#xff0c;需要在包含数百万行数据的数据库中频繁地检索特定信息&#xff0c;而每次这样的查询都伴随着复杂的计算&#xff0c;耗费大量时间和资源。你可以考虑采用物化视图这一功能&#xff0c;提高查询效率。 物化视图是什么&#xff1f; 物化视图…

加快推进新质生产力,利驰牵手央视栏目助推电气行业数字化

利驰成功入围《信用中国》 4月22日&#xff0c;《信用中国》栏目选题会在北京顺利举行。利驰软件(苏州)有限公司创始人令永卓受邀参加此次选题会&#xff0c;并成功入围了《信用中国》栏目&#xff0c;利驰软件借助栏目组进入品牌建设与创新的战略新征程。 《信用中国》是一档…

Java-数据库连接(JDBC小白教学)

&#xff01;文章最后附有完整代码&#xff01; 目录 &#x1f516;JDBC概述 &#x1f516;JDBC连接数据库 &#x1f516;添加数据&#xff08;insert&#xff09; &#x1f516;修改数据&#xff08;Update&#xff09; &#x1f516;删除数据&#xff08;delete&#x…

【千帆AppBuidler】零代码构建AI人工智能应用,全网都在喊话歌手谁能应战,一键AI制作歌手信息查询应用

欢迎来到《小5讲堂》 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景创建应用平台地址随机生成快速创建应用头像应用名称应用描述…

VMware Workstation 17.5.2 Pro 发布,产品订阅模式首个重大变更

VMware Workstation 17.5.2 Pro 发布&#xff0c;产品订阅模式首个重大变更 基于 x86 的 Windows、Linux 桌面虚拟化软件 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-workstation-17/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页…

Python 全栈体系【四阶】(四十三)

第五章 深度学习 九、图像分割 3. 常用模型 3.4 DeepLab 系列 3.4.1 DeepLab v1(2015) 3.4.1.1 概述 图像分割和图像分类不一样&#xff0c;要对图像每个像素进行精确分类。在使用CNN对图像进行卷积、池化过程中&#xff0c;会导致特征图尺寸大幅度下降、分辨率降低&…

全志R128 SDK HAL 模块开发指南之PWM

PWM 模块介绍 脉冲宽度调制&#xff08;PWM&#xff09;是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用&#xff0c;方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM 具有以下特点&#xff1a; 支持脉冲&#xff08;脉冲个数可配&#xf…

【java】异常与错误

Throwable包括Error和Expected。 Error Error错误是程序无法处理的&#xff0c;由JVM产生并抛出的。 举例&#xff1a;StackOverflowError \ ThreadDeath Expected Expected异常包括两类&#xff0c;即受检异常(非运行时异常)和非受检异常(运行时异常)&#xff0c;异常往往…

oracle 临时表 在sql 里面用完要删除吗

临时表 在sql 里面用完要删除吗 在Oracle数据库中&#xff0c;如果您使用的是ON COMMIT DELETE ROWS创建的临时表&#xff0c;那么当当前会话结束或者执行了显式的COMMIT或ROLLBACK操作后&#xff0c;表中的数据会自动被清除。这意味着通常情况下&#xff0c;您不需要手动删除…

阿里云服务器下,部署LNMP环境安装wordpress

目录 1 LNMP部署1、简单说明2、nginx部署3、php8 安装4、mysql8安装5、配置 nginx 实现支持 PHP 程序6、安装 php 组件7、测试 2 wordpress部署1、安装2、配置 总结 1 LNMP部署 1、简单说明 首先需要明白&#xff0c;LNMP指的是Linux、Nginx、MySQL、PHP。而如果使用阿里云服…

数字化应用标杆 | 又两家成套厂效率翻倍,利用率高达93%以上!

利驰 联能 & 利驰 俊郎 近日&#xff0c;利驰数字科技&#xff08;苏州&#xff09;有限公司&#xff08;简称利驰软件&#xff09;成功与俊郎电气有限公司&#xff08;简称俊郎电气&#xff09;、浙江联能电气有限公司&#xff08;简称联能电气&#xff09;成功确立了数字…

【全开源】国际版JAVA同城服务美容美发到店服务上门服务系统源码支持Android+IOS+H5

国际版同城服务美容美发到店与上门服务系统&#xff1a;一站式打造美丽新体验 随着人们生活水平的提高和审美观念的升级&#xff0c;美容美发服务已成为人们日常生活中不可或缺的一部分。为了满足全球消费者的多样化需求&#xff0c;我们推出了“国际版同城服务美容美发到店与…

时间管理的误区:为什么你越高效就越没有时间?

在平衡生活和工作的过程中&#xff0c;时间管理无疑很重要。然而&#xff0c;许多人发现在提高效率后&#xff0c;却发现自己越来越感到时间紧迫&#xff0c;仿佛陷入了一个无解的循环。这背后的原因&#xff0c;往往是由于一系列时间管理的误区所致。 一个常见的误区是&…

在 CLion、Dev-C++ 或 Code::Blocks 下面配置 EasyX

前言 本文提供了将 EasyX 适配到 MinGW 上的库文件&#xff0c;并详细介绍如何将 EasyX 配置到 DevCpp 或 CodeBlocks 等以 MinGW 为编译器的集成开发环境。 库文件下载 点击这里下载 easyx4mingw_20220901 点击这里下载 easyx4mingw_20220610 &#xff08;上个版本&#x…

Php 读取execl

安装PhpSpreadsheet composer require phpoffice/phpspreadsheet <?phprequire vendor/autoload.php; // 引入Composer自动加载文件use PhpOffice\PhpSpreadsheet\IOFactory;// 指定Excel文件路径 $filePath path/to/your/excel/file.xlsx;try {// 加载Excel文件$spreadsh…

C++并发:锁

一、前言 C中的锁和同步原语的多样化选择使得程序员可以根据具体的线程和数据保护需求来选择最合适的工具。这些工具的正确使用可以大大提高程序的稳定性和性能&#xff0c;本文讨论了部分锁。 二、std::lock 在C中&#xff0c;std::lock 是一个用于一次性锁定两个或多个互斥…

鸿蒙 DevEcoStudio:关系型数据库增删改查练习

修改entry/src/main/ets/entryability目录下的EntryAbility.ts文件&#xff1a; 在 export default class EntryAbility extends UIAbility {onCreate(want, launchParam) {hilog.info(0x0000, testTag, %{public}s, Ability onCreate); 之后添加&#xff1a; const config…

学习Nginx(五):虚拟主机配置

核心功能 在演示虚拟主机配置之前&#xff0c;来看一下Nginx配置的核心功能说明。 了解配置更多功能&#xff0c;请查看官方说明&#xff1a; http://nginx.org/en/docs/ngx_core_module.html [rootRockyLinux9 conf]# cat nginx.conf # 核心功能&#xff0c;全局配置 # 设置启…

【Vue3源码实现】Ref isRef unRef proxyRefs实现

前言 在上篇文章中 我们了解了响应式原理&#xff0c;并在最后实现了reactive。 上文链接&#x1f525;&#x1f525;&#x1f525;Vue3响应式原理实现与track和trigger依赖收集和触发依赖 在我们的日常业务中&#xff0c;我们有可能需要将一个基础数据类型的值也转换成响应式…

Linux 生态与工具

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 目录 Linux生态简介:Linux工具lrzsz&#xff…