SpringBoot中的AOP使用

news2025/7/9 8:50:19

文章目录

  • SpringBoot中的AOP使用
    • 1.AOP介绍
    • 2. AOP 编程术语
      • 2.1切面(Aspect)
      • 2.2连接点(JoinPoint)
      • 2.3切入点(Pointcut)
      • 2.4目标对象(Target)
      • 2.5通知(Advice)
    • 3.切入点表达式
      • 3.1AspectJ表达式
      • 3.2表达式举例:
    • 4.Aspect中的通知类型
      • 4.1常用四种类型
      • 4.2相关概念
      • 4.3相关注解
    • 5.spring boot集成AOP
      • 5.1环境准备
      • 5.2实例一
      • 5.3实例二

SpringBoot中的AOP使用

1.AOP介绍

Spring的AOP利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,
简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。

总结:AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。

2. AOP 编程术语

2.1切面(Aspect)

切面泛指交叉业务逻辑,或是公共的,通用的业务。上例中的事务处理、日志处理就可以理解为切面。常用的切面是通知(Advice)。实际就是对主业务逻辑的一种增强。

切面有切点和通知组成,即包括横切逻辑的定义也包括连接点的定义

2.2连接点(JoinPoint)

连接点指可以被切面织入的具体方法。通常业务接口中的方法均为连接点。

程序执行的某个特定位置,如某个方法调用前后等。

2.3切入点(Pointcut)

切入点指声明的一个或多个连接点的集合。通过切入点指定一组方法。
被标记为 final 的方法是不能作为连接点与切入点的。因为最终的是不能被修改的,不能被增强的。

在程序应用中就是你要增强功能的类或方法(确认位置)。

2.4目标对象(Target)

目标对象指 将要被增强 的对象。 即包含主业 务逻辑的 类的对象。 上例中 的
BookServiceImpl 的对象若被增强,则该类称为目标类,该类对象称为目标对象。当然, 不被增强,也就无所谓目标不目标了。

目标对象,通知织入的目标类。

2.5通知(Advice)

通知表示切面的执行时间,Advice 也叫增强。上例中的 MyInvocationHandler 就可以理解为是一种通知。换个角度来说,通知定义了增强代码切入到目标代码的时间点,是目标方法执行之前执行,还是之后执行等。通知类型不同,切入时间不同。
切入点定义切入的位置,通知定义切入的时机。

通知,是织入到目标类连接点上的一段代码,就是增强到什么地方?增强什么内容?

3.切入点表达式

3.1AspectJ表达式

表达式共 4 个部分可简化如下:
execution(访问权限 方法返回值 方法声明(参数) 异常类型)

AspectJ 定义了专门的表达式用于指定切入点。

切入点表达式要匹配的对象就是目标方法的方法名。所以,execution 表达式中明显就是方法的签名。注意,表达式中黑色文字表示可省略部分,各部分间用空格分开。在其中可以使用以下符号:

在这里插入图片描述

3.2表达式举例:

execution(public * *(..))
指定切入点为:任意公共方法。

execution(* set*(..))
指定切入点为:任何一个以“set”开始的方法。

execution(* com.xyz.service.impl.*.*(..))
指定切入点为:定义在 service 包里的任意类的任意方法。

execution(* com.xyz.service..*.*(..)) * com.xyz.service.power2.aa.*.*(..)
指定切入点为:定义在 service 包或者子包里的任意类的任意方法。“…”出现在类名中时,后面必须跟“*”,表示包、子包下的所有类。
execution(* *..service.*.*(..)) a.b.service.*.*(..) a.b.c.d.service.*.*(..)
指定所有包下的 serivce 子包下所有类(接口)中所有方法为切入点

execution(* *.service.*.*(..))
指定只有一级包下的 serivce 子包下所有类(接口)中所有方法为切入点

4.Aspect中的通知类型

4.1常用四种类型

(1)前置通知@Before
切入点方法执行之前执行的方法@Before

(2)环绕通知@Around

切入点前后都执行 @Around
(3)异常通知@AfterThrowing
切入发点方法执行异常后执行的方法@AfterThrowing:切入点里面的出现异常如10/0,才会执行的方法。
(4)后置通知@After
后置通知,在方法执行之后执行

4.2相关概念

Joinpoint(连接点)
所谓连接点是指那些被拦截到的点,在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点,通俗的说就是被增强类中的所有方法

PointCut(切入点)
所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义,通俗的说就是被增强类中的被增强的方法,因为被增强类中并不是所有的方法都被代理了

Advice(通知/增强)
所谓通知是指拦截到 Joinpoint (被增强的方法)之后所要做的事情就是通知,通俗的说就是对被增强的方法进行增强的代码

4.3相关注解

@Component 将当前类注入到Spring容器内

@Aspect :表明是一个切面类

@Pointcut :切入点,PointCut(切入点)表达式有很多种,其中execution用于使用切面的连接点。

5.spring boot集成AOP

5.1环境准备

在这里插入图片描述

引入AOP相关的依赖

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

在这里插入图片描述
创建controller测试访问

在这里插入图片描述

5.2实例一

使用aop来完成全局请求日志处理
步骤一:创建一个aspect切面类

@Component
@Aspect
public class MyAop {

    //切入点
    //表示public 这个包下的任意方法作为切入点
    @Pointcut("execution(public * com.jierlung.controller.*.*(..))")
    public void log(){
        System.out.println("pointCut签名......");
    }

    //前置通知
    @Before(value = "log()")
    public void deBefore(){
        System.out.println("我是前置通知呀...");
    }


    //返回通知
    @AfterReturning(returning = "ret", pointcut = "log()")
    public void doAfterReturning(Object ret) throws Throwable {
        // 处理完请求,返回内容
        System.out.println("返回通知:方法的返回值 : " + ret);
    }

    //异常通知
    @AfterThrowing(throwing = "ex", pointcut = "log()")
    public void throwss(JoinPoint jp,Exception ex){
        System.out.println("异常通知:方法异常时执行.....");
        System.out.println("产生异常的方法:"+jp);
        System.out.println("异常种类:"+ex);
    }

    //后置通知
    @After("log()")
    public void after(JoinPoint jp){
        System.out.println("后置通知:最后且一定执行.....");
    }

}

测试访问
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

分析:
第一步:首先通过注解形式定义切面类,把切面类注入容器,交给spring管理

第二步:定义一个方法,加上切入点的注解,指定切哪个包下的类的所有方法,这个作为切入点,该类的方法执行时,例如我访问controller里面的方法时,这个controller就被我作为切入点,该方法执行时,会执行到切入的方法,执行相关业务代码。

第三步:注解方式加上通知,切入点写之前定义的方法,构成一个切面(由切入点和通知组成)。

5.3实例二

@annotation方式

编写一个自定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface MyLogAnnotation {

    //定义一个变量,可以接受参数
    String desc() default " ";
}

在这里插入图片描述
定义一个切面类

@Component
@Aspect
public class MyAopAnnotation {

    @Pointcut(value = "@annotation(com.jierlung.annotation.MyLogAnnotation)")
    //切入点签名
    public void logAnnotation(){
        System.out.println("pointCut签名。。。");
    }

    //前置通知
    @Before("logAnnotation()")
    public void deBefore(JoinPoint jp) throws Throwable {
        // 接收到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        // 记录下请求内容
        System.out.println("URL : " + request.getRequestURL().toString());
    }
    //返回通知
    @AfterReturning(returning = "ret", pointcut = "logAnnotation()")
    public void doAfterReturning(Object ret) throws Throwable {
        // 处理完请求,返回内容
        System.out.println("返回通知:方法的返回值 : " + ret);
    }

    //异常通知
    @AfterThrowing(throwing = "ex", pointcut = "logAnnotation()")
    public void throwss(JoinPoint jp,Exception ex){
        System.out.println("异常通知:方法异常时执行.....");
        System.out.println("产生异常的方法:"+jp);
        System.out.println("异常种类:"+ex);
    }

    //后置通知
    @After("logAnnotation()")
    public void after(JoinPoint jp){
        System.out.println("后置通知:最后且一定执行.....");
    }


}

在目标方法上加上注解
在这里插入图片描述
测试访问
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【经济调度】基于蝙蝠算法实现电力系统经济调度附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

【Qt按钮基类】QAbstractButton[ 所有按钮基类 ]

【Qt按钮基类】QAbstractButton[ 所有按钮基类 ]Qt开启-》按钮基类 QAbstractButton一、setText (设置文本)二、text&#xff08;获取文本&#xff09;三、setIcon&#xff08;设置图标&#xff09;四、icon&#xff08;获取图标&#xff09;五、 iconSize &#xff08;获取图标…

体系结构29_多处理机的互联网络

互连网络是将集中式系统或分布式系统中的结点连接起来所构成的网络&#xff0c;这些结点可能是处理器、存储模块或者其它设备&#xff0c;它们通过互连网络进行信息交换。在拓扑上&#xff0c;互连网络为输入和输出两组结点之间提供一组互连或映象&#xff08;mapping&#xff…

通力科技通过注册:9个月营收3.4亿 项献忠家族色彩浓厚

雷递网 雷建平 11月25日浙江通力传动科技股份有限公司&#xff08;简称&#xff1a;“通力科技”&#xff09;日前通过注册&#xff0c;准备在深交所创业板上市。通力传动计划募资3.45亿元。其中&#xff0c;2亿元用于新增年产5万台工业减速机智能工厂技改项目&#xff0c;5041…

成为一名厉害的程序员,需要哪些必备知识

程序员在入职时&#xff0c;大部分互联网公司都会进行基础知识的考察&#xff0c;基础知识的重要性不言而喻。计算机基础知识对程序员来说很重要。计算机核心基础知识方面&#xff0c;算法、数据结构、组成原理、网络等涉及到的基础知识一定要彻底掌握&#xff0c;牢牢记住并融…

[附源码]java毕业设计智能视频推荐网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

3.90 OrCAD软件Annote命令下的每个选项的含义是什么?OrCAD软件Title Block中的原理图页数如何进行增加?

笔者电子信息专业硕士毕业&#xff0c;获得过多次电子设计大赛、大学生智能车、数学建模国奖&#xff0c;现就职于南京某半导体芯片公司&#xff0c;从事硬件研发&#xff0c;电路设计研究。对于学电子的小伙伴&#xff0c;深知入门的不易&#xff0c;特开次博客交流分享经验&a…

【自学前端】HTML篇已完结(附14节视频)

I have a dream,Front end development will not require additional training. 目录 内容预览 通过这里找视频&#xff1a; 1、内容仍然有所欠缺 2、目前以0基础再实战为主 3、目前未包含面试题 4、下一步的计划 5、希望收到反馈 内容预览 △ 目前纯HTML篇课程已经完成…

【项目实战:核酸检测平台】第三章 利其器

第三章 利其器 摘要:俗话说的好工欲善其事&#xff0c;必先利其器&#xff0c;框架搭的好&#xff0c;开发起来很舒服&#xff0c;搭的不好&#xff0c;开发起来就很痛苦。 一个程序员只会写业务代码&#xff0c;最多算是个码农&#xff0c;搭框架的本事、遇到难题的解决能力…

Docker学习(5)—— 在Docker上安装软件

一. 安装Tomcat 1. 下载最新版 (1) 拉取Tomcat镜像 docker pull tomcat (2) 查看是否拉取到Tomcat镜像 docker images tomcat (3) 创建Tomcat容器并启动 docker run -d -p 8080:8080 tomcat 这时访问tomcat首页报404错误&#xff0c;有以下两个原因&#xff1a;①防火…

[计算机毕业设计]大数据的B站数据分析与可视化

目录 前言 课题背景和意义 实现技术思路 数据爬取 数据可视化 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研…

为什么 NGINX 的 reload 不是热加载?

作者&#xff1a;刘维 这段时间在 Reddit 看到一个讨论&#xff0c;为什么 NGINX 不支持热加载&#xff1f;乍看之下很反常识&#xff0c;作为世界第一大 Web 服务器&#xff0c;不支持热加载&#xff1f;难道大家都在使用的 nginx -s reload 命令都用错了&#xff1f; 带着这个…

入职阿里必会199道SpringCloud面试题,你能掌握多少?

前言 Spring Cloud 自 2016 年 1 月发布第一个 Angel.SR5 版本&#xff0c;到目前 2020 年 3 月发布 Hoxton.SR3 版本&#xff0c;已经历经了 4 年时间。这 4 年时间里&#xff0c;Spring Cloud 一共发布了 46 个版本&#xff0c;支持的组件数从 5 个增加到 21 个。 Spring C…

linux用户及用户组的分类、管理

一、分类 1.用户和用户组分类 &#xff08;1&#xff09;用户分类 超级用户&#xff08;root&#xff09;——它具有一切权限&#xff0c;只有进行系统维护&#xff08;例&#xff1a;建立用户&#xff09;或其他必要情形下才用超级用户登录&#xff0c;以避免系统出现安全问…

Qt程序打包成一个单独exe的方法

目录 Qt程序打包成一个单独exe的方法 程序发布 程序打包 问题 Qt程序打包成一个单独exe的方法 Qt程序发布及打包&#xff0c;同时修改可执行文件的图标。本教程使用Qt自带的 windeployqt 工具外加Enigma Virtual Box打包工具。首先需要知道的是&#xff0c;Qt程序发布需要的…

【MM小贴士】物料主数据的中止与后继(3)

话不多说&#xff0c;直接上3&#xff0c; 前两篇的blog可以参考&#xff1a; 【MM小贴士】物料主数据的中止与后继(1)_竹大的博客-CSDN博客https://yanshoushuai.blog.csdn.net/article/details/125660495【MM小贴士】物料主数据的中止与后继(2)_竹大的博客-CSDN博客https:/…

QT 事件处理

03 Qt中是事件处理_哔哩哔哩_bilibili 1&#xff0c;新加mylabel文件&#xff0c;并 修改mylabe的基类QLabel 2 label提升为类 3&#xff0c;鼠标事件 myLabel.h #ifndef MYLABEL_H #define MYLABEL_H#include <QLabel>class myLabel : public QLabel {Q_OBJECT public…

TCP三次握手四次挥手简介

TCP三次握手四次挥手简介 图解三次握手、四次挥手 建立连接&#xff1a;三次握手 关闭连接&#xff1a;四次挥手 上图传递过程中出现的几个字符&#xff08;SYN,ACK,FIN,seq,ack&#xff09;各代表什么意思 SYN&#xff0c;ACK&#xff0c;FIN存放在TCP的标志位(标志位一共有…

【设计模式】设计模式的七大原则

目录标题4. 设计模式的七大原则4.1 开闭原则&#xff08;对扩展开发&#xff0c;对修改关闭&#xff1a;需要接口和抽象类来实现&#xff09;Demo: 搜狗输入法 的皮肤设计4.2 里氏替换原则&#xff08;任何基类可以出现的地方&#xff0c;子类一定可以出现&#xff1a;尽量不要…

[Redis]-四种部署方式

森格 | 2022年11月 本文是对Redis部署方式的学习&#xff0c;主要学习基本原理&#xff0c;以及几种方式的优缺点。 一、部署方式概况 对于Redis的安装部署主要可以分为单机版、主从同步、Sentinel哨兵、Cluster集群部署四种方式&#xff0c;下面一起看下几种方式的优缺点。 二…