Spring AOP详解,简单Demo

目录

一、Spring AOP 是什么?

二、学习AOP 有什么作用?

三、AOP 的组成

四、 Spring AOP 简单demo


一、Spring AOP 是什么?

Spring AOP(Aspect-Oriented Programming in Spring)是Spring框架中的一个重要组件,它实现了面向切面编程(AOP)的思想。AOP是一种编程范式,旨在通过预编译方式和运行期动态代理实现程序功能的统一维护。它利用一种称为“切面”(Aspect)的技术,将那些与业务逻辑无关,却为多个业务逻辑所共同调用的逻辑或责任(例如事务处理、日志记录、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可维护性和可拓展性。

在Spring AOP中,切面被定义为一个包含通知(Advice)和切点(Pointcut)的对象。通知是切面的实际行为,它定义了切面要执行的操作,如前置通知(Before Advice)、后置通知(After Advice)、环绕通知(Around Advice)等。切点则定义了通知应该应用于哪些连接点(Joinpoint),连接点是程序执行过程中能够应用通知的位置,如方法调用、异常抛出等。

Spring AOP主要使用代理模式来实现AOP的功能。当Spring容器启动时,它会根据配置或注解创建代理对象,这些代理对象会拦截对目标对象的调用,并在调用前后或调用过程中执行相应的通知逻辑。这样,在不修改原有目标对象代码的情况下,我们可以动态地为目标对象添加额外的功能或行为。

总的来说,Spring AOP提供了一种灵活且强大的机制,使得开发者能够更加方便地处理那些跨越多个类或方法的横切关注点,从而提高代码的可维护性和可扩展性。

二、学习AOP 有什么作用?

学习AOP(面向切面编程)的作用主要体现在以下几个方面:

  1. 解耦业务逻辑与横切关注点:在软件开发中,经常有一些与业务逻辑无关但却横跨多个模块的功能需求,如日志记录、事务管理、安全性控制等。这些横切关注点会散布在代码的各个角落,导致业务逻辑与这些关注点紧密耦合,难以维护。AOP通过将这些横切关注点从业务逻辑中分离出来,使代码更加清晰、整洁,便于管理和维护。

  2. 提高代码重用性和模块化:AOP允许开发者将通用的功能逻辑封装成切面,然后在需要的地方进行引用。这样,相同的逻辑只需要编写一次,就可以被多个模块复用,大大提高了代码的重用性和模块化程度。

  3. 降低代码复杂性:通过将横切关注点从业务逻辑中分离出来,AOP可以简化业务逻辑的代码,使其更加专注于实现核心功能。同时,AOP还提供了强大的连接点模型,允许开发者精确地控制通知的执行时机和范围,进一步降低了代码的复杂性。

  4. 增强系统的可扩展性和可维护性:由于AOP将横切关注点与业务逻辑分离,因此当需要修改或添加新的横切关注点时,只需要修改或添加相应的切面即可,而不需要修改业务逻辑代码。这大大增强了系统的可扩展性和可维护性。

  5. 统一处理异常和错误:AOP可以帮助我们统一处理异常和错误,例如在一个切面中定义异常处理的逻辑,然后在多个地方引用这个切面。这样,当程序抛出异常时,我们可以自动记录日志、发送通知或执行其他操作,而不需要在每个可能抛出异常的地方都编写相同的处理代码。

  6. 支持跨方法的逻辑:AOP能够处理跨多个方法的逻辑,这对于一些需要在多个方法之间共享状态或执行共同操作的场景非常有用。。

三、AOP 的组成

3.1、切面(Aspect)

切面是AOP的核心概念,它定义了横切关注点的逻辑。切面由通知(Advice)和切点(Pointcut)组成,它既包含了横切关注点的定义,也包含了何时将这些横切关注点应用到目标对象上的逻辑。

 3.2、切点(Pointcut)

切点用于定义切面要通知的具体连接点。一个切面并不需要通知应用的所有连接点,切点有助于缩小切面所通知的连接点范围。切点使用特定的语法来描述,以确定哪些连接点应该被通知。

切点相当于保存了众多连接点的一个集合(如果把切点看成一个表,而连接点就是表中一条一条的数 据)。

3.3、通知(Advice) 

通知就是 AOP 的具体执行动作。具体的,在程序中被拦截后会触发一个具体的动作,就是通知中具体实现的业务代码

定义了切面是什么,何时使用,其描述了切面要完成的工作,还解决何时执行这个工作的问题。 Spring 切面类中,可以在方法上使用以下注解,会设置方法为通知方法,在满足条件后会通知本方法进行调 用 

  • 前置通知使用 @Before:通知方法会在(该注解的value)切入目标方法调用之前执行。
  • 后置通知使用 @After: 通知方法会在(该注解的value)切入目标方法返回或者抛出异常之后调用。
  • 返回之后通知使用 @AfterReturning: 通知方法会在目标方法正常执行完毕之后调用
  • 抛异常后通知使用 @AfterThrowing: 通知方法会在目标方法抛出异常后调用。
  • 环绕通知使用 @Around:设置指定的通知处理方法(该注解的value)切入到目标方法前后执行,功能约等于@Before+@AfterReturning。

3.4、连接点

会触发 AOP 规则的所有的点(所有请求)。

四、 Spring AOP 简单demo

4.1、添加 Spring AOP  框架依赖

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

4.2、定义切面

@Aspect //告诉spring 这是一个切面类
@Component
public class AopConfig {
}

4.3、定义切点

@Aspect //告诉spring 这是一个切面类
@Component
public class AopConfig {//切点@Pointcut("execution(* com.zcm.Demo.controller.*.*(..))")public void pointcut() {}}
@Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
  1. @Pointcut: 这是一个注解,用于定义一个切点。切点是AspectJ中用于确定哪些连接点(如方法调用、异常处理等)应该被通知(advice)或拦截的表达式。

  2. "execution( com.example.demo.controller.UserController.(..))"**: 这是切点的表达式。它的含义如下:

    • execution(): 表示我们正在匹配方法执行。
    • *: 表示匹配任何返回类型。
    • com.example.demo.controller.UserController: 表示我们只想匹配com.example.demo.controller.UserController这个类中的方法。
    • .*: 表示匹配UserController中的任何方法名。
    • (..): 表示匹配任何数量的参数,无论参数的类型和数量如何。

4.4、定义通知

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Aspect //告诉spring 这是一个切面类
@Component
public class AopConfig {//切点@Pointcut("execution(* com.zcm.Demo.controller.*.*(..))")public void pointcut(){}@Before("pointcut()")public void beforeAdvice(){System.out.println("执行了前置通知");}@After("pointcut()")public void afterAdvice(){System.out.println("执行了后置通知");}/*** 环绕通知* @param joinPoint* @return* @throws Throwable*/@Around("pointcut()")public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("进入了环绕通知~");String str = joinPoint.proceed().toString();String newStr = str.substring(0, 8);System.out.println("退出了环绕通知~");return newStr;}}

 执行结果

进入了环绕通知~
执行了前置通知
userTest方法执行了
aop执行了
执行了后置通知
退出了环绕通知~

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

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

相关文章

c# 构造函数 静态构造函数 内联字段(即静态字段和实例字段) 父类构造函数 父类静态构造函数 父类内联字段 执行顺序

顺序如下&#xff1a; 1.子类的内联字段 2.子类的静态构造函数 3.父类的内联字段 4.父类的静态构造函数 5.父类的构造函数 6.子类的构造函数 7.子类的方法 public class A{public static string a1"A0";static A(){Console.WriteLine("父类内联字段&#xff1a;…

基于遗传优化算法的TSP问题求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于遗传优化算法的TSP问题求解&#xff0c;分别对四个不同的城市坐标进行路径搜索。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 3.核心程序 ....…

LT6911GX HDMI2.1 至四端口 MIPI/LVDS,带音频 龙迅方案

1. 描述LT6911GX 是一款面向 VR / 显示应用的高性能 HDMI2.1 至 MIPI 或 LVDS 芯片。HDCP RX作为HDCP中继器的上游&#xff0c;可以与其他芯片的HDCP TX配合使用&#xff0c;实现中继器功能。对于 HDMI2.1 输入&#xff0c;LT6911GX 可配置为 3/4 通道。自适应均衡功能使其适合…

学习C语言的指针

有一阵没更新了&#xff0c;因为最近比较繁忙&#xff0c;所以更新比较慢&#xff0c;还在慢慢学习 话不多说&#xff0c;开始今天的内容&#xff0c;聊一聊C语言指针。 很多小伙伴可能会被指针这个名字吓到&#xff0c;觉得很难&#xff0c;实际上确实有点难&#xff0c;但是…

关于谷歌浏览器对于https的证书不通过校验的无法跳转的问题

谷歌浏览器对于https的证书问题会出现如下提示: 解决方法: 直接在页面输入 thisisunsafe 就能跳转了.

SpringCloud系列(21)--更换Ribbon的负载均衡模式

前言&#xff1a;在上一篇文章中我们介绍了关于Ribbon的知识点已经如果去应用Ribbon&#xff0c;而本章节内容则是关于如何去切换Ribbon的负载均衡模式。 以下是上篇文章的部分内容&#xff0c;可以再看下熟悉下&#xff0c;方便后续理解 Ribbon工作架构图 Ribbon的负载均衡模式…

Linux基本指令(3)

目录 时间相关的指令&#xff1a; 1.在显示方面&#xff0c;使用者可以设定欲显示的格式&#xff0c;格式设定为一个加好后接数个标记&#xff0c;其中常用的标记列表如下&#xff1a; 2.在设定时间方面&#xff1a; 3.时间戳&#xff1a; Cal指令&#xff1a; find指令&a…

机器学习:驱动现代交通运输革命的AI智慧引擎

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

22 - Hadoop HA 高可用集群搭建、手动模式、自动模式以及HA模式集群

目录 1、HA 概述 2、HDFS-HA 集群搭建 2.1、HDFS-HA 核心问题 3、HDFS-HA 手动模式 3.1、环境准备 3.2、规划集群 3.3、配置 HDFS-HA 集群 3.4、启动 HDFS-HA 集群 4、HDFS-HA 自动模式 4.1、HDFS-HA 自动故障转移工作机制 4.2、HDFS-HA 自动故障转移的集群规划 4.…

使用CSS3 + Vue3 + js-tool-big-box工具,实现炫酷五一倒计时动效

时间过得真是飞速&#xff0c;很快又要到一年一度的五一劳动节啦&#xff0c;今年五天假&#xff0c;做好准备了吗&#xff1f;今天我们用CSS3 Vue3 一个前端工具库 js-tool-big-box来实现一个炫酷的五一倒计时动效吧。 目录 1 先制作一个CSS3样式 2 Vue3功能提前准备 3…

中科数安 | 电脑文件落地透明加密软件系统

#电脑文件加密软件# 中科数安的文件落地透明加密软件系统是一种先进的信息安全解决方案&#xff0c;旨在保护企业内部的敏感数据免受内外部威胁。 PC地址&#xff1a;www.weaem.com 该系统的特点和功能主要包括&#xff1a; 透明加密技术&#xff1a;系统自动对指定类型或目录…

Web 服务器解析漏洞 原理以及修复方法

漏洞名称 &#xff1a;Web服务器解析漏洞 漏洞描述&#xff1a; 服务器相关中间件存在一些解析漏洞&#xff0c;攻击者可通过上传一定格式的文件&#xff0c;被服务器的中间件进行了解析&#xff0c;这样就对系统造成一定危害。常见的服务器解析漏洞涉及的中间件有IIS&#x…

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

第五章 深度学习 八、目标检测 3. 目标检测模型 3.1 R-CNN 系列 3.1.1 R-CNN 3.1.1.1 定义 R-CNN(全称 Regions with CNN features) &#xff0c;是 R-CNN 系列的第一代算法&#xff0c;其实没有过多的使用“深度学习”思想&#xff0c;而是将“深度学习”和传统的“计算…

Mac NTFS磁盘读写工具选择:Tuxera还是Paragon?

在Mac上使用NTFS磁盘时&#xff0c;选择一款合适的读写工具至关重要。Tuxera和Paragon作为两款备受推崇的Mac NTFS磁盘读写工具&#xff0c;都能够帮助用户轻松地实现NTFS格式的读写。那么&#xff0c;面对这两款功能强大的工具&#xff0c;我们应该如何选择呢&#xff1f;本文…

CACTER AI实验室:AI大模型在邮件安全领域的应用

随着人工智能技术的飞速发展&#xff0c;AI已经深入到生活的各个领域。AI大模型在邮件安全领域展现出巨大潜力&#xff0c;尤其是反钓鱼检测上的应用&#xff0c;正逐渐展现出其独特的价值。 4月24日&#xff0c;CACTER AI实验室高级产品经理刘佳雄在直播交流会上分享了CACTER …

c语言——二叉树

目录 目录 二叉树关键概念理解 一颗拥有1000个结点的树度为4&#xff0c;则它的最小深度是&#xff1f; 那么对于二叉树&#xff0c;只掌握这些是远远不够的&#xff0c;我们还需要掌握几个最基本的经典问题&#xff0c; 求二叉树大小 求叶子结点个数 求深度 求第k层的…

Window11安装vim编辑器

我们在做git操作的时候&#xff0c;很多文字编辑工作会默认打开 Vim 编辑器来进行操作。 Vim 是一个高度可配置的文本编辑器&#xff0c;旨在让创建和更改任何类型的文本变得非常高效。大多数 UNIX 系统和 Apple OS X 都将它作为vi包含在内&#xff0c;用惯了Linux中的Vim编辑器…

长江证券:地产需求,去哪儿呢?

核心观点&#xff1a; 1.来有影&#xff0c;去无踪。无论是价格还是销量&#xff0c;年初以来房地产市场进一步深度调整。现实的直观感受是&#xff0c;住房需求锐减以及二手房供给骤增。如此短期变化&#xff0c;能否用人口、城镇化等长期因素来解释&#xff1f;是否能通过不…

“地表最强”文生视频模型?Sora 背后有何秘密?

自 2022 年底 ChatGPT 的横空出世&#xff0c;人工智能再度成为全世界的焦点&#xff0c;基于大语言模型&#xff08;LLM&#xff09;的 AI 更是人工智能领域的“当红炸子鸡”。此后的一年&#xff0c;我们见证了 AI 在文生文、文生图领域的飞速进展&#xff0c;但在文生视频领…

【C++】学习笔记——内存管理

文章目录 二、类和对象20. 友元1. 友元函数2.友元类 21. 内部类22. 匿名对象23. 拷贝对象时的一些编译器优化 三、内存管理1. C/C内存分布2. C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free3. C内存管理方式 未完待续 二、类和对象 20. 友元 1. 友元函数 我…