【Spring】Spring AOP面向切面编程

news2024/11/28 4:44:59

文章目录

  • 什么是Spring AOP?
  • 为什么要使用AOP?
  • AOP相关组成的概念
    • 切面
    • 切点
    • 通知
    • 连接点
  • Spring AOP实现
    • 创建切面
    • 创建切点
    • 创建通知
    • 创建连接点
    • 示例演示
  • Spring AOP的实现原理

什么是Spring AOP?

想要知道Spring AOP,就得先了解AOP

AOP是面向切面编程,是一种思想,是对某一类事情的集中处理,如登录校验功能,我们需要在每个需要验证用户是否登录的地方都要实现一遍相同的逻辑,但是有了AOP,我们只需要在某一处进行配置,所有需要判断用户登录的地方就可以全部实现用户登录校验,不用在每一处需要的地方再进行相同的校验逻辑了

AOP是一种思想,Spring AOP是一种具体实现的框架

为什么要使用AOP?

对一些功能统一,使用较多,我们就可以考虑使用AOP思想进行统一处理,如登录校验,使得我们不用在每一处需要做登录校验的地方进行相同逻辑的代码实现了

除了登录校验,AOP还可以用在这些地方:

  • 统一日志记录
  • 统一方法执行时间统计
  • 统一返回格式
  • 统一异常处理
  • 事务开启和提交

AOP相关组成的概念

切面

指的是某一类事情的具体内容,比如用户登录校验就是一个切面,日志统一记录也是一个切面,切面由切点和通知组成,通常切面是一个

切点

切点通常是类中的一个方法(该方法没有实现),作用是提供一组规则来匹配连接点,如登录拦截规则

通知

通知是方法中内容的具体实现,用来执行AOP具体的业务

  • 前置通知@Before:在目标方法执行前调用
  • 后置通知@After:在目标方法执行后调用
  • 环绕通知@Around:在目标方法执行前后调用
  • 异常通知@AfterThrowing:在目标方法抛出异常调用
  • 方法返回通知@AfterReturning:在目标方法返回后调用

连接点

所有可能触发切点的地方就是连接点,如某个页面或者某个接口满足切点中的设置的规则

Spring AOP实现

添加Spring Boot AOP框架支持

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

创建切面

切面是包含切点和通知的

@Component //交给容器管理
@Aspect //切面
public class UserAOP {
    
}

在这里插入图片描述

创建切点

切点一般是定义拦截规则

    //定义切点,设置拦截规则
    @Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
    public void pointcut(){}

切点表达式由切点函数组成,其中execution()是最常用的切点函数,用来匹配方法,语法为:

execution(<修饰符><返回类型><包.类.⽅法(参数)><异常>)

其中修饰符和异常可以省略,下面是具体含义:

  • 修饰符(一般省略):public(公共方法),*(任意)
  • 返回类型(不能省略):void,String,int,*(任意)
  • 包:com.demo(固定包),com.*(com包下所有),com.demo..(com.demo包下所有子包含自己)
  • 类:Test(固定类),Test*(以之开头),*test(以之结尾),*(任意)
  • 方法名(不能省略):addUser(固定方法),add*(以add开头),*add(以add结尾),*(任意)
  • 参数:(),(int),(int,String),(..)任意参数
  • 异常(可省略,一般不写)

创建通知

    @Before("pointcut()")
    public void doBefore(){
        System.out.println("执行了前置通知:"+ LocalDateTime.now());
    }

创建连接点

@RestController
public class UserController {

    @RequestMapping("/hello")
    public String hello(){
        System.out.println("hello spring aop");
        return "hello spring aop";
    }
}

示例演示

启动项目,访问url,观察打印结果:

在这里插入图片描述
在这里插入图片描述

从中发现,拦截成功,拦截后,在执行目标方法 hello() 之前,先执行了前置通知@Before方法

再加上后置通知,看看执行效果:

    @After("pointcut()")
    public void doAfter(){
        System.out.println("执行了后置通知:"+LocalDateTime.now());
    }

在这里插入图片描述

添加环绕通知,先将刚才的前置后置注释掉,看打印结果:

    @Around("pointcut()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("环绕通知前");
        Object obj = joinPoint.proceed();
        System.out.println("环绕通知后");
        return obj;
    }

在这里插入图片描述

将前置后置打开,观察打印结果:

在这里插入图片描述

关于打印顺序的说明:
在这里插入图片描述

Spring AOP的实现原理

Spring AOP是建立在动态代理的基础上,Spring对AOP的支持局限于方法级别的拦截
在这里插入图片描述
动态代理呢就是当调用者调用目标对象的时候,它不会与目标对象接触,而是由代理类进行调用

代理的生成时机织入:织入就是把切面应用到目标对象并创建新的代理对象的过程,切面在指定的连接点被织入到目标对象中,在目标对象的生命周期里,有多个点可以进行织入

  • 编译期间:切面在类编译时被织入
  • 类加载期间:切面在类被加载到jvm时被织入
  • 运行期:切面在程序运行的某一时刻被织入,在织入切面时,AOP容器会为目标对象动态创建一个代理对象,Spring AOP就是以这种方式织入切面的

Spring AOP支持JDK ProxyCGLIB方式实现动态代理,这两种方式都是在程序运行期,动态的将切面织入字节码形成代理对象

JDK动态代理与CGLIB的区别:

  • JDK动态代理要求被代理的类必须实现接口,CGLIB动态代理不要求被代理的类实现接口,而是通过继承被代理类
  • JDK动态代理性能相对较高,生成代理对象速度较快,而CGLIB动态代理性能相对较低,生成代理对象速度较慢
  • CGLIB动态代理无法代理final类和final方法,而JDK动态代理可以代理任意类的方法

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

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

相关文章

【周期信号】工程测试-数据处理-信号分析课程试题:周期信号与周期信号相加,所得信号一定是周期信号吗?

一、问题分析 某课程的作业题中&#xff0c;有下面的一种题目&#xff0c;判断两个周期信号相加&#xff0c;是否是周期信号&#xff0c;以及计算周期长短是多少。 非常显然&#xff0c;1、3、4题都很容易判断。 第2题&#xff0c;我们重点分析。 二、网上的错误论述 在百…

Vivado运用 Language Template 来创建set_input_delay/set_output...

时序约束中的 set_input_delay/set_output_delay 约束一直是一个难点&#xff0c;无论是概念、约束值的计算&#xff0c;还是最终的路径分析&#xff0c;每一次都要费一番脑子。Vivado为方便用户创建输入输出接口的约束&#xff0c;整理出了一套非常实用的InputDelay/Output De…

【C++】类与对象(3)

【C】类与对象&#xff08;3&#xff09; 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2023.5.9 本篇博客干货比较多&#xff0c;主要是对类和对象知识的进一步加深&#xff0c;可能有点晦涩。主要介绍的内容为&#xff1a;深入构造函数&#xff0c;初始化列表&#xff0c…

《操作系统》——进程与线程

在上一期博客中&#xff0c;我们学习了关于操作系统中计算机系统概述的基本知识。今天&#xff0c;我将带领学习的是关于操作系统中一个非常重要的概念——进程与线程&#xff01;&#xff01;&#xff01; 目录 前言 &#xff08;一&#xff09;进程的基本概念和特征 1、进…

[golang gin框架] 33.Gin 商城项目- 集成支付宝微信支付、生成支付二维码、监听处理异步通知跳转到订单页面

一.界面展示 当用户点击去支付时,请求支付界面,并 展示对应订单相关数据,以及 支付方式相关操作,点击对应的支付方式,进行支付操作 该界面对应的功能: 1.进入该界面,后台逻辑判断: 是否存在该订单,如果不存在,则跳转到购物车页面;如果存在,则获取对应订单相关数据,并 渲染到页面…

0511课后作业(C高级)

1.编写一个名为myfirstshell.sh的脚本&#xff0c;它包括以下内容。 1、包含一段注释&#xff0c;列出您的姓名、脚本的名称和编写这个脚本的目的 2、和当前用户说“hello 用户名” 3、显示您的机器名 hostname 4、显示上一级目录中的所有文件的列表 5、显示变量PATH和HOM…

iOS播放与编辑HDR视频

在iPhone12发布后&#xff0c;支持使用Dolby Vision来录制HDR视频。至此&#xff0c;升级到iOS14.1系统后&#xff0c;已经支持录制、播放、编辑和导出HDR视频。接下来&#xff0c;让我们一起探索HDR视频的各种操作。 一、HDR视频边编辑边预览 1、Profile与Level HDR视频中&…

Java奠基】实现面向对象编程方法

目录 标准的JavaBean类 设计对象并使用 对象封装 this关键字 构造方法 要知道对象是一个又一个能帮助我们解决问题的东西&#xff0c;但是这些东西并不是凭空出现的&#xff0c;需要我们根据设计图来进行制造&#xff0c;而这些一个一个的设计图就是一个一个的类。 标准的…

ChatGPT分销版多开v3.9.1-新增 语音识别和绘画多个引擎-已测试

众所周知ChatGPT在国内是无法正常使用的 而我们模块要做的就是这一点让普通人使用上ChatGPT 或娱乐或作为生产力工具 当前ChatGPT是非常火的 但是国内环境复杂&#xff0c;所以机会来了。。。 ChatGPT分销版多开v3.9.1&#xff1a;公众号H5版本 目前没反编译前端容易封号…

计算机网络-SNMP协议与pysnmp

1.概念 2.典型架构 3.snmp的信息交互 4.MIB 4.1常见MIB节点 5.SNMP管理模型 MIB位于被管理进程 6.SNMP的三个版本 6.1 SNMPv1 6.2 SNMPv2C 6.3 SNMPv3 6.3.1 SNMP3的基本操作 6.3.2 SNMP交互GET 6.3.3 SNMP交互-GETBULK 6.3.4 SNMP交互-SET 6.3.5 SNMP交互-trap 6.3.6 SNMP交…

【开源之夏 2023】欢迎报名 Dragonfly、Kata Containers、Nydus 社区项目!

开源之夏是由“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动&#xff0c;旨在鼓励在校学生积极参与开源软件的开发维护&#xff0c;促进优秀开源软件社区的蓬勃发展&#xff0c;培养和发掘更多优秀的开发者。 活动联合国内外各大开源社区&#xff0c;针对重要开…

Dubbo消费端源码深入分析(8)

目录 简介 过滤器 &#xff08;Filter&#xff09; 负载均衡接口 &#xff08;LoadBalance&#xff09; 容错接口 &#xff08;Cluster&#xff09; 源码分析 1. 获取Invoker过程 2. 获取动态代理对象proxy 3. 最后调用此动态代理对象的invoke方法 过滤器、容错组件、负…

基础IO(二)

磁盘 1.基础概念2.磁盘线性理解3.文件系统4.inode与文件名5.理解增删查改6.补充细节 &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列专栏&#xff1a;【Linux的学习】 &#x1f4dd;&#x1f4…

Chapter7:非线性控制系统分析(下)

第七章:非线性控制系统分析 Exercise7.11 设非线性系统结构图如下图所示,分析系统运动并计算自振参数。 解: 将 3 3 3个串联非线性环节进行等效合并,由于反馈通道饱和特性与前向通道饱和特性同时进入饱和状态,所以反馈通道的非线性环节相当于不起作用,将前向通道的另两…

【计算机视觉 | 自然语言处理】Hugging Face 超详细介绍和使用教程

文章目录 一、前言二、可以获得什么&#xff1f;三、入门实践3.1 帮助文档3.2 安装3.3 模型的组成3.4 BERT模型的使用3.4.1 导入模型3.4.2 使用模型3.4.2.1 tokenizer 3.5 model3.6 后处理 一、前言 Hugging Face 起初是一家总部位于纽约的聊天机器人初创服务商&#xff0c;他…

URP渲染管线里面的摄像机用法

大家好&#xff0c;我是阿赵&#xff0c;这里继续讲一下URP渲染管线。 这次要讲的是URP渲染管线里面的摄像机用法 之前介绍过&#xff0c;URP摄像机和普通摄像机的属性显示上有比较大的变化&#xff1a; 接下来从用法上来说明一下&#xff1a; 1、多个摄像机的处理变化 多个…

unity UGUI系统梳理 -交互组件

概述 unity 中的交互组件可用于处理交互&#xff0c;例如鼠标或触摸事件以及使用键盘或控制器进行的交互 1、按钮 (Button) Button详解 2、开关 (Toggle) Background&#xff1a;背景图片&#xff0c;控制toggle组件的背景颜色改变&#xff0c;从而展示此物体是否被选中的…

5.View的事件分发机制/事件处理机制原理分析

事件MotionEvent包含了哪几个? ACTION_DOWN 手指触碰到屏幕时触发,只会执行一次ACTION_MOVE 手指在屏幕上滑动出发,会执行多次ACTION_UP 手指抬起离开屏幕出发,只会执行一次ACTION_CANCEL 事件被上层拦截时会触发 父容器ViewGroup需要从子View手中抢夺分发的事件进行处理时,会…

【SCI】综合能源系统中热电联产、电制气和碳捕集系统的建模与优化(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Java 网络编程 —— 非阻塞式编程

线程阻塞概述 在生活中&#xff0c;最常见的阻塞现象是公路上汽车的堵塞。汽车在公路上快速行驶&#xff0c;如果前方交通受阻&#xff0c;就只好停下来等待&#xff0c;等到公路顺畅&#xff0c;才能恢复行驶。 线程在运行中也会因为某些原因而阻塞。所有处于阻塞状态的线程…