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.mfbz.cn/a/582636.html

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

相关文章

python部署linux

项目做完了&#xff0c;就涉及到了部署 部署 Python的打包部署方式有多种&#xff0c;具体取决于项目的需求、规模以及所使用的工具。以下是几种常见的Python打包部署方式&#xff1a; 使用pip安装&#xff1a;对于小型的Python库或工具&#xff0c;通常可以直接通过pip进行安…

《恶意不息》是一款什么样的游戏,苹果电脑怎么玩《恶意不息》恶意不息游戏内怎么存档 mac电脑玩游戏

近日steam游戏商城新上架了一款名叫《恶意不息》的游戏十分火爆&#xff0c;那么《恶意不息》是一款什么样的游戏&#xff0c;苹果电脑怎么玩《恶意不息》&#xff1f;一起来看看吧&#xff01; 一、《恶意不息》是一款什么样的游戏&#xff1f; Private Division&#xff0c;…

云手机对出海企业有什么帮助?

近些年&#xff0c;越来越多的企业开始向海外拓展&#xff0c;意图发掘更广阔的市场。在这过程中&#xff0c;云手机作为一个新型工具为很多企业提供了助力&#xff0c;尤其在解决海外市场拓展过程中的诸多挑战方面发挥着作用。 首先&#xff0c;云手机的出现解决了企业在海外拓…

Python数组类+AI插件

目录 规划实现初始化插入删除查找 AI插件单测注释调优建议 小结 规划 先想清楚都写哪些&#xff0c;然后再动手操作 用Python写了一个简单数组类&#xff0c;首先思考下都写哪些功能&#xff1a; 插入删除查找用插件做单元测试和写注释 目的只是实现一个简单的数组类&#x…

对2023年图灵奖揭晓看法

2023年图灵奖揭晓&#xff0c;你怎么看&#xff1f; 2023年图灵奖&#xff0c;最近刚刚颁给普林斯顿数学教授 Avi Wigderson&#xff01;作为理论计算机科学领域的领军人物&#xff0c;他对于理解计算中的随机性和伪随机性的作用&#xff0c;作出了开创性贡献。这些贡献不仅推…

chrome 查看版本安装路径、cmd命令行启动浏览器

chrome 查看版本安装路径 浏览器输入 chrome://version/cmd命令行启动浏览器 参考&#xff1a;https://blog.csdn.net/bigcarp/article/details/121426245 "C:\Program Files\Google\Chrome\Application\chrome.exe" www.baidu.com"C:\Program Files\Google…

9种单片机常用的软件架构

长文预警&#xff0c;加代码5000多字&#xff0c;写了4个多小时&#xff0c;盘软件架构&#xff0c;这篇文章就够了! 可能很多工程师&#xff0c;工作了很多年&#xff0c;都不会有软件架构的概念。 因为我在做研发工程师的第6年&#xff0c;才开始意识到这个东西&#xff0c;在…

meterpreter运行run getgui -e报错

meterpreter运行run getgui -e报错 meterpreter > run getgui -e [!] Meterpreter scripts are deprecated. Try post/windows/manage/enable_rdp. [!] Example: run post/windows/manage/enable_rdp OPTIONvalue [...] [-] The specified meterpreter session script cou…

云仓酒庄央视广告战略签约,旗下品牌将迎来全新发展机遇

近日&#xff0c;备受瞩目的云仓酒庄2024-2025年度央视广告战略签约仪式盛大举行&#xff0c;云仓酒庄副总裁周玄代表云仓酒庄签约。云仓酒庄与中视中州&#xff08;央视代理机构&#xff09;成功签约&#xff0c;将在CCTV 2财经、CCTV 15音乐、CCTV 7国防军事、CCTV 4中文国际…

kubernetes共享存储原理

存储原理 1. PersistentVolume (PV)&#xff1a;存储资源的容器2. PersistentVolumeClaim (PVC)&#xff1a;用户的需求清单3. StorageClass&#xff1a;存储服务的菜单A. Container Storage Interface (CSI)小总结PersistentVolume (PV)PersistentVolumeClaim (PVC)静态分配 v…

1.Spring入门-初识Spring核心思想IOC和快速入门

Spring Spring Framework 是一个开源的 Java/Java EE 全功能栈&#xff08;full-stack&#xff09;的应用程序框架&#xff0c;以 Apache 许可证形式发布&#xff0c;也有 .NET 平台上的移植版本。该框架基于 Expert One-on-One Java EE Design and Development&#xff08;IS…

hive使用hplsql进行etl或其它数据加工

参照 https://cwiki.apache.org/confluence/pages/viewpage.action?pageId59690156 http://www.hplsql.org/doc Hive HPL/SQL&#xff0c;即Hive Hybrid Procedural SQL一个开源工具&#xff0c;它为hive实现了过程性的SQL功能&#xff0c;类似Oracle的PLSQL。从hive 2.0.0开…

Spring中的声明式事务详解

1 事务概述 在JavaEE企业级开发的应用领域&#xff0c;为了保证数据的完整性和一致性&#xff0c;必须引入数据库事务的概念&#xff0c;所以事务管理是企业级应用程序开发中必不可少的技术。 事务就是一组由于逻辑上紧密关联而合并成一个整体(工作单元)的多个数据库操作&…

Springboot+Vue项目-基于Java+MySQL的家政服务平台系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

Java中一个汉字究竟占几个字节?

前言 在今天&#xff0c;“Java中一个汉字占几个字符”的问题&#xff0c;让我提起了兴趣 在我的记忆中&#xff0c;一个字符应该是占两个字符的。但看了他人的回答 发现自己对这方面了解非常片面&#xff0c;于是痛定思痛潜心学习&#xff0c;写下这篇博客 总结不足文章目录 …

0425DormAJAX项目

0425DormAJAX项目包-CSDN博客 数据库字段 添加界面&#xff1a; 初始状态&#xff1a; 点击性别&#xff0c;宿舍号使用ajax动态添加&#xff1a; 学生主界面&#xff1a; 实现分页查询&#xff1a; 点击修改学生宿舍&#xff0c;查看换寝记录&#xff0c;ajax动态显示列表&…

引入高德地图

1、配置 试试keytool 有没有反应 就算java -version没问题也一定是你没配path路径 在系统中配到bin就行了 2、获取密钥 网上真的坑太多了还有有chat问了一下 keytool -v -list -keystore "C:\Users\xxxx\.android\debug.keystore"执行这个你看你的 3、去高德地…

QFileDialog窗口没有文件选择路径框问题的处理方法

QFileDialog作为QT自带的文件对话框&#xff0c;其界面有挑选文件路径的区域 但在某些操作系统下&#xff08;如欧拉操作系统&#xff09;&#xff0c;文件挑选框QFileDialogLineEdit可能会隐藏&#xff0c;导致无法选择文件路径 解决方法&#xff1a; QFileDialog* fd; fd-&…

【团体程序设计天梯赛】往年关键真题 L2-026 小字辈 递归 L2-027 名人堂与代金券 排序 详细分析完整AC代码

【团体程序设计天梯赛 往年关键真题 详细分析&完整AC代码】搞懂了赛场上拿下就稳 【团体程序设计天梯赛 往年关键真题 25分题合集 详细分析&完整AC代码】&#xff08;L2-001 - L2-024&#xff09;搞懂了赛场上拿下就稳了 【团体程序设计天梯赛 往年关键真题 25分题合…

2024最新docker部署gitlab

docker部署gitlab 快速命令 1 拉取镜像 docker pull gitlab/gitlab-ce2 启动容器 docker run -itd \-p 9980:80 \-p 9922:22 \-v /opt/soft/docker/gitlab/etc:/etc/gitlab \-v /opt/soft/docker/gitlab/log:/var/log/gitlab \-v /opt/soft/docker/gitlab/opt:/var/opt/g…
最新文章