springboot 整合 AOP切面编程

文章目录

  • 什么是AOP切面编程
  • AOP中重要概念
    • 切面
    • 连接点
    • 通知
    • 切入点
  • springboot的切面编程的步骤
    • 引入切面编程依赖
    • 开发附加操作(在springboot项目新建config配置)

什么是AOP切面编程

所谓AOP就是一种编程范例,我们一般做一个项目,会分为很多个模块,这些模块中有很多不同的功能,功能中有很多不同的切入点,举个例子,现在我们有一个保存用户业务逻辑功能,我们需要在保存用户之前输入一句话,这句话必须在保存用户之前做到,一般对我们springboot项目中,针对这样的情况,我们就会在Service层的代码中加入一行,如下图所示:

===================保存用户业务逻辑=================
用户业务
UserServicevoid save(User user)void delete(Integer id);User queryById(Integer id);....UserServiceImpl implement UserServicevoid save(User user){sout("=============");//业务功能-1...userDao.save(user);}

但是你想过没有,假设我们又要在删除用户的逻辑中也输出这样的一行内容呢?
我们是不是又要在业务逻辑层中又增加这样的一行呢?

  void delete(Integer id){sout("=============");//业务功能-1......userDao.delete(id);}

那如果我们的其他模块的功能结构也需要这样这样的功能,那岂不是我们都要去加入这一行,这岂不是很麻烦吗?所以我们引入了AOP,我们能把这个要加入的功能,作为一个关注点切入进去,就不用交织在每个模块的代码中,而是作为一个单独的模块存在。
从这里我们就可以发现AOP解决了两个问题:一个是代码混乱,核心的业务逻辑代码还必须兼顾其他功能,这就导致不同功能的代码交织到一起,可读性很差。
第二,是代码分散问题。同一个功能代码分散在多个模块中,不易维护。

AOP中重要概念

切面

切面(Aspect)由切点(Pointcut)和通知(Advice)组成,它既包含了横切逻辑的定义,也包括了连接点的定义。

连接点

应用执行过程中能够插入切面的一个点,这个点可以是方法调用时,抛出异常时,甚至修改字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。
总的来说,就是程序执行的某一刻的,在这个点可以做的额外操作。

通知

切面的工作被称之为通知。

切入点

切入点是用来描述连接点的,它决定了当前代码与连接点匹配

我们可以简单的把 AOP 理解为贯穿于方法之中,在方法执行前、执行时、执行后、返回值后、异常后要执行的操作。

springboot的切面编程的步骤

引入切面编程依赖

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

开发附加操作(在springboot项目新建config配置)

/*** 自定义切面配置类*/
@Configuration //代表这个类是spring的配置类
@Aspect //代表这个类是切面配置类
public class MyAspectConfig {//切面Aspect=Advice附加操作+Pointcut切入点@Before("execution(* com.demo.springbootaoptest.service.*.*(..))")//代表这是一个核心业务逻辑执行之前的附加操作,value属性表明切书店public void before(JoinPoint joinPoint){System.out.println("=========前置附加操作=========");System.out.println("当前执行目标类: "+ joinPoint.getTarget());System.out.println("当前执行目标类中方法: "+ joinPoint.getSignature().getName());}@After("execution(* com.demo.springbootaoptest.service.*.*(..))")public void after(){System.out.println("后置通知");}@Around("execution(* com.demo.springbootaoptest.service.*.*(..))")public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {System.out.println("==========进入环绕的前置操作===========");System.out.println("当前执行类: "+proceedingJoinPoint.getTarget());System.out.println("方法名: "+proceedingJoinPoint.getSignature().getName());//放心目标方法执行Object proceed = proceedingJoinPoint.proceed();//继续处理  业务逻辑方法执行System.out.println("==========进入环绕的后置操作===========");return null;
}  
}

我对这上面的注解一一进行解释

  • @Aspect 用来类上,代表这个类是一个切面
  • @Before 用在方法上代表这个方法是一个前置通知方法
  • @After 用在方法上代表这个方法是一个后置通知方法
  • @Around 用在方法上代表这个方法是一个环绕的方法

另外这个方法是 上述 的 execution() 方法,用于匹配需要被 AOP 切入的方法。

execution() 方法的参数有以下几个:

"*" 表示匹配任意类型的方法。
com.demo.springbootaoptest.service 表示匹配 com.demo.springbootaoptest.service 包下的所有类。
.* 表示匹配所有类的所有方法。
(..) 表示匹配方法的任意参数。

service类

public class UserService {public void save(String name){
//       System.out.println("===========================");//=》额外操作System.out.println("处理save核心业务逻辑,调用mapper");}public void delete(Integer id) {System.out.println("===========================");System.out.println("处理delete核心业务逻辑,调用mapper");}public void update(String name){System.out.println("处理update核心业务逻辑,调用mapper");}public String find(String name){System.out.println("处理find核心业务逻辑,调用mapper");return name;}
}

前置结果
在这里插入图片描述

后置结果
在这里插入图片描述

环绕结果
这里要特别解释一下环绕通知的流程

在方法执行前,打印一条日志,表示进入环绕的前置操作。
获取目标方法的执行类和方法名。
调用 proceed() 方法,让目标方法执行。
在方法执行后,打印一条日志,表示进入环绕的后置操作。
在这里插入图片描述

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

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

相关文章

人工智能基础-Numpy的arg运算-Fancy Indexing-比较

索引 获取最小值最大值索引 np.argmin(x) np.argmax(x)排序和使用索引 np.sort(x)Fancy Indexing 索引 二维数组的应用 numpy.array 的比较 比较结果和Fancy Indexing

在Django Admin添加快捷方式django-admin-shortcuts

在Django管理主页上添加简单漂亮的快捷方式。 1.安装 pip install django-admin-shortcuts 2在settings.py注册django-admin-shortcuts INSTALLED_APPS [admin_shortcuts,django.contrib.admin,....... ] 3.添加ADMIN_SHORTCUTS设置 ADMIN_SHORTCUTS [ { ti…

XML传参方式

export function groupLoginAPI(xmlData) {return http.post(/tis/group/1.0/login, xmlData, {headers: {Content-Type: application/xml,X-Requested-With: AAServer/4.0,}}) }import {groupLoginAPI} from "../api/user"; function (e) { //xml格式传参let groupX…

Pudgy Penguins NFT 概览与数据分析

作者&#xff1a;stellafootprint.network 数据来源&#xff1a;Pudgy Penguins NFT Collection Dashboard “胖企鹅” Pudgy Penguins NFT 系列是由 8,888 个独特的企鹅头像组成的以太坊区块链项目。这个 NFT 项目能否在 2024 年达到发展的高峰&#xff1f; 关于 Pudgy Pe…

Vim编辑器

1.文件复制 拷贝/etc/profile 数据到/root 目录下 cp /etc/profile /root如果root文件夹在上一目录下 cp /etc/profile ../root 2.打开文件 vim etc/profile 打开ect文件夹中的profile文件 3.文件编辑 文件编辑分为一般模式 与编辑模式。打开文件为一般模式&#xff0c;按…

Linux网络编程 基础

OSI七层模型 物理层&#xff1a;主要定义物理设备标准&#xff0c;如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流&#xff08;就是由1、0转化为电流强弱来进行传输&#xff0c;到达目的地后再转化为1、0&#xff0c;也就是我们常说的…

leetcode刷题日志-146LRU缓存

思路&#xff1a;使用hashmap储存key&#xff0c;vaule&#xff0c;使用双向链表以快速查到尾结点&#xff08;待逐出的节点&#xff09;&#xff0c;链表的题一定要在纸上画一下&#xff0c;不然连着连着就不知道连在哪里去了 class LRUCache {public class ListNode {int ke…

深入解剖指针篇(3)

个人主页&#xff08;找往期文章&#xff09; &#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 二级指针 指针数组 指针数组模拟二维数组 字符指针变量 数组指针 数组指针初始化 二维数组传参的本质 函数指针 函数指针的使用 typedef关键字 函数指针数组 二级指针…

【IIC,存储器最强总结】

IIC&#xff0c;存储器总结 存储器介绍AT24C02介绍IIC介绍扩展 上拉&#xff0c;下拉&#xff0c;开漏 IIC时序结构 存储器介绍 存储器介绍&#xff1a; RAM易失性存储器/RAM&#xff1a;随机存取存储器&#xff08;英语&#xff1a;Random Access Memory&#xff0c;缩写&…

Linux服务详解

如有错误或有补充&#xff0c;以及任何改进的意见&#xff0c;请在评论区留下您的高见&#xff0c;同时文中给出大部分命令的示例&#xff0c;即是您暂时无法在Linux中查看&#xff0c;您也可以知道各种操作的功能以及输出 如果觉得本文写的不错&#xff0c;不妨点个赞&#x…

基于SSM的个性化旅游攻略定制系统设计与实现(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的个性化旅游攻略定制系统设计与实现&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xf…

2路DIN2路DO2路AIN远程4GRTU模块钡铼技术S270

钡铼技术的S270远程4G RTU模块是一款高性能的工业级远程终端单元&#xff0c;它支持2路数字输入(DIN)、2路数字输出(DO)以及2路模拟输入(AIN)&#xff0c;并通过4G网络实现数据的远程传输。这种模块的设计旨在满足各种工业自动化和监控需求&#xff0c;特别适用于那些位于偏远地…