AOP开发
目录
1、简介
1.1、AOP 相关概念
1.2、AOP 开发明确的事项
1.3、知识要点
2、两种方式
3、基于 XML
3.1、快速入门
3.1.1、导入坐标
3.1.2、创建接口和实现类
3.1.3、创建切面
3.1.4、配置bean
3.1.5、配置织入
3.1.6、测试
3.2、切点表达式
3.2.1、表达式举例
3.2.2、表达式抽取
3.3、通知的类型
3.3.1、什么是通知
3.3.2、如何配置
4、基于注解
4.1、快速入门
4.1.1、创建接口和实现类
4.1.2、创建切面
4.1.3、配置bean
4.1.4、配置织入
4.1.5、组件扫描和自动代理
4.1.6、测试
4.2、注解通知类型
4.3、表达式抽取
1、简介
1.1、AOP 相关概念
Spring 的 AOP 实现底层就是对上面的动态代理的代码进行了封装,封装后我们只需要对需要关注的部分进行代码编写,并通过配置的方式完成指定目标的方法增强。
在正式讲解 AOP 的操作之前,我们必须理解 AOP 的相关术语,常用的术语如下:
- Target(目标对象):代理的目标对象
- Proxy (代理):一个类被 AOP 织入增强后,就产生一个结果代理类
- Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点
- Pointcut(切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义
- Advice(通知/ 增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知
- Aspect(切面):是切入点和通知(引介)的结合
- Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程。spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入
1.2、AOP 开发明确的事项
1. 需要编写的内容
编写核心业务代码(目标类的目标方法)
编写切面类,切面类中有通知(增强功能方法)
在配置文件中,配置织入关系,即将哪些通知与哪些连接点进行结合
2. AOP 技术实现的内容
Spring 框架监控切入点方法的执行。一旦监控到切入点方法被运行,使用代理机制,动态创建目标对象的
代理对象,根据通知类别,在代理对象的对应位置,将通知对应的功能织入,完成完整的代码逻辑运行。
3. AOP 底层使用哪种代理方式
在 spring 中,框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式。
1.3、知识要点
- aop:面向切面编程
- aop底层实现:基于JDK的动态代理 和 基于Cglib的动态代理
- aop的重点概念:
-
- Pointcut(切入点):被增强的方法
- Advice(通知/ 增强):封装增强业务逻辑的方法
- Aspect(切面):切点+通知
- Weaving(织入):将切点与通知结合的过程
- 开发明确事项:
-
- 谁是切点(切点表达式配置)
- 谁是通知(切面类中的增强方法)
- 将切点和通知进行织入配置
2、两种方式
AOP(Aspect-Oriented Programming,面向切面编程)开发可以通过两种主要方式来实现:编程式和声明式。这两种方式分别对应了在代码中直接编写切面逻辑和使用特定的配置来描述切面逻辑的两种不同方式。
- 编程式 AOP: 编程式 AOP 是指在代码中直接编写切面逻辑。这种方式要求开发人员在代码中显式地调用切面逻辑,通常通过方法调用来实现。编程式 AOP 提供了最大的灵活性,开发人员可以精确控制切面逻辑的应用时机,但可能会导致代码冗余和可维护性降低。
- 声明式 AOP: 声明式 AOP 是指使用特定的配置来描述切面逻辑,而不需要在代码中显式调用切面逻辑。这种方式通过在配置文件中或使用注解来定义切面逻辑的应用时机和规则。声明式 AOP 提供了更好的可维护性和代码模块化,使切面逻辑与主要业务逻辑分离,提高了代码的可读性和可维护性。
在声明式 AOP 中,有两种常见的方式:
- 基于 XML 配置: 在配置文件中使用 XML 描述切面逻辑的织入时机和规则,如 Spring AOP 的 XML 配置。
- 基于注解: 使用注解来标记切面逻辑的应用时机和规则,如 Spring AOP 的基于注解的方式。
两种方式各有优势,选择哪种方式取决于项目需求和团队偏好。编程式 AOP 提供了更大的灵活性,适用于一些特定的场景。而声明式 AOP 则提供了更好的可读性和维护性,适用于大多数项目,可以更好地实现横切关注点的分离和处理。
下面着重讲解两种声明式AOP。
3、基于 XML
3.1、快速入门
基本步骤如下:
① 导入 AOP 相关坐标
② 创建目标接口和目标类(内部有切点)
③ 创建切面类(内部有增强方法)
④ 将目标类和切面类的对象创建权交给 spring
⑤ 在 applicationContext.xml 中配置织入关系
⑥ 测试代码
整体目录如下:
3.1.1、导入坐标
<!--导入aop相关坐标--> <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.5.RELEASE</version> </dependency> <!-- aspectj的织入 --> <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.13</version> </dependency>
3.1.2、创建接口和实现类
3.1.3、创建切面
3.1.4、配置bean
3.1.5、配置织入
3.1.6、测试
3.2、切点表达式
表达式语法:
execution([修饰符] 返回值类型 包名.类名.方法名(参数))
访问修饰符可以省略
返回值类型、包名、类名、方法名可以使用星号* 代表任意
包名与类名之间一个点 . 代表当前包下的类,两个点 .. 表示当前包及其子包下的类
参数列表可以使用两个点 .. 表示任意个数,任意类型的参数列表
3.2.1、表达式举例
例:
execution(public void com.itheima.aop.Target.method())
execution(void com.itheima.aop.Target.*(..))
execution(* com.itheima.aop.*.*(..))
execution(* com.itheima.aop..*.*(..))
execution(* *..*.*(..))
下面依次解释这些切点表达式的含义:
- execution(public void com.itheima.aop.Target.method()):
-
- 匹配 com.itheima.aop 包下的 Target 类的 method 方法。
- 该方法的修饰符为 public,返回类型为 void,不接受任何参数。
- 表示只匹配具体的类、方法和参数。
- execution(void com.itheima.aop.Target.*(..)):
-
- 匹配 com.itheima.aop 包下的 Target 类的任何方法。
- 该方法的修饰符不限,返回类型为 void。
- (..) 表示方法可以接受任意个数和类型的参数。
- execution(* com.itheima.aop.*.*(..)):
-
- 匹配 com.itheima.aop 包下的任何类的任何方法。
- 方法的修饰符、返回类型和参数都不限。
- execution(* com.itheima.aop..*.*(..)):
-
- 匹配 com.itheima.aop 包及其子包下的任何类的任何方法。
- 方法的修饰符、返回类型和参数都不限。
- execution(* *..*.*(..)):
-
- 匹配任何包下的任何类的任何方法。
- 方法的修饰符、返回类型和参数都不限。
- 通配符 *..* 表示任意包名和子包。
这些切点表达式用于匹配不同范围的类和方法,可以根据需要来选择最合适的表达式。在 AOP 中,切点表达式用于指定切面逻辑的应用时机,从而实现横切关注点的处理。
3.2.2、表达式抽取
当多个增强的切点表达式相同时,可以将切点表达式进行抽取,在增强中使用 pointcut-ref 属性代替 pointcut 属性来引用抽取后的切点表达式。
3.3、通知的类型
3.3.1、什么是通知
通知(Advice): 通知是切面的一个具体行为,它决定在连接点处执行何种逻辑。
通常有以下几种类型的通知:前置通知(Before)、后置通知(After)、返回通知(AfterReturning)、异常通知(AfterThrowing)和环绕通知(Around)。
通知(Advice)是 AOP 中的核心概念之一,它代表了在特定连接点(方法调用、对象实例化等)处执行的切面逻辑。通知决定了在连接点何时以及如何执行特定的操作。AOP 提供了不同类型的通知,以便在不同的执行时机应用切面逻辑,从而实现横切关注点的分离。
以下是通常在 AOP 中使用的不同类型的通知:
- 前置通知(Before Advice): 前置通知在目标方法执行之前执行。它通常用于执行一些准备操作,如权限检查、参数验证等。
- 后置通知(After Advice): 后置通知在目标方法执行之后执行,无论目标方法是否抛出异常。它常用于资源释放或记录日志等操作。
- 返回通知(AfterReturning Advice): 返回通知在目标方法成功执行并返回结果后执行。它可以获取目标方法的返回值并进行相应处理。
- 异常通知(AfterThrowing Advice): 异常通知在目标方法抛出异常时执行。它可以用于捕获和处理异常,或者执行一些与异常相关的操作。
- 环绕通知(Around Advice): 环绕通知是最强大且最灵活的通知类型。它可以完全控制目标方法的执行过程,包括在方法前后进行自定义操作,还可以选择是否调用目标方法。
这些通知类型允许开发人员根据业务需求在不同的执行时机添加切面逻辑。通过组合不同类型的通知,可以实现对应用程序的不同层面进行横切关注点的处理,如日志记录、事务管理、安全性检查等。通知是 AOP 的核心元素之一,它使得切面逻辑能够在合适的时机被织入到目标代码中,从而实现了代码的解耦和模块化。
3.3.2、如何配置
通知类型 | XML 配置示例 |
前置通知(Before) |
|
后置通知(After) |
|
返回通知(AfterReturning) |
|
异常通知(AfterThrowing) |
|
环绕通知(Around) |
|
4、基于注解
4.1、快速入门
基于注解的aop开发步骤:
① 创建目标接口和目标类(内部有切点)
② 创建切面类(内部有增强方法)
③ 将目标类和切面类的对象创建权交给 spring
④ 在切面类中使用注解配置织入关系
⑤ 在配置文件中开启组件扫描和 AOP 的自动代理
⑥ 测试
目录如下:
4.1.1、创建接口和实现类
4.1.2、创建切面
4.1.3、配置bean
这个时候的切面类,还只是一个普通的Bean,需要后续配置。
4.1.4、配置织入
4.1.5、组件扫描和自动代理
4.1.6、测试
4.2、注解通知类型
通知的配置语法:@通知注解(“切点表达式")
通知类型 | 注解 | 说明 |
前置通知 | @Before | 指定增强的方法在切入点方法之前执行 |
后置通知 | @AfterReturning | 指定增强的方法在切入点方法之后执行 |
环绕通知 | @Around | 指定增强的方法在切入点方法之前和之后都执行 |
异常抛出通知 | @AfterThrowing | 指定增强的方法在出现异常的时候执行 |
最终通知 | @After | 无论增强方法执行是否有异常都会执行 |
4.3、表达式抽取
同 xml 配置 aop 一样,我们可以将切点表达式抽取。
抽取方式是在切面内定义方法,在该方法上使用@Pointcut注解定义切点表达式,然后再在增强注解中进行引用。
具体如下:
相关文章:

AOP开发
目录 1、简介 1.1、AOP 相关概念 1.2、AOP 开发明确的事项 1.3、知识要点 2、两种方式 3、基于 XML 3.1、快速入门 3.1.1、导入坐标 3.1.2、创建接口和实现类 3.1.3、创建切面 3.1.4、配置bean 3.1.5、配置织入 3.1.6、测试 3.2、切点表达式 3.2.1、表达式举例 …...

Streamlit项目: 轻松搭建部署个人博客网站
文章目录 1 前言1.1 探索 Streamlit:轻松创建交互式应用1.2 最全 Streamlit 教程专栏 2 我的个人博客网站已上线!2.1 一个集成了智能中医舌诊-中e诊专栏的博客网站2.2 前期准备2.3 使用 Streamlit Cloud 运行 3 知识点讲解3.1 实现多页面:两种…...

手把手教你如何实现内网搭建电影网站并进行公网访问(保姆级教学)
手把手教你如何实现内网搭建电影网站并进行公网访问 文章目录 手把手教你如何实现内网搭建电影网站并进行公网访问前言1. 把软件分别安装到本地电脑上1.1 打开PHPStudy软件,安装一系列电影网站所需的支持软件1.2 设置MacCNS10的运行环境1.3 进入电影网页的安装程序1…...

Redis_事务操作
13. redis事务操作 13.1事务简介 原子性(Atomicity) 一致性(Consistency) 隔离性(isolation) 持久性(durabiliby) ACID 13.2 Redis事务 提供了multi、exec命令来完成 第一步,客户端使用multi命令显式地开启事务第二步,客户端把事务中要执行的指令发…...

python质检工具(pylint)安装使用总结
1、Pylint Pylint工具主要类似java中的checkStyle和findbugs,是检查代码样式和逻辑规范的工具。 1.1、Pylint安装流程: 打开PyCharm软件,打开如图1.1所示Terminal终端窗口,先查看python版本和pip版本,pip是19.0.3,python是2.7 图1.1 运行pip install pylint安装pylin…...
“深入探究JVM:解密Java虚拟机的工作原理“
标题:深入探究JVM:解密Java虚拟机的工作原理 摘要:本文将深入探究Java虚拟机(JVM)的工作原理,包括JVM的组成部分、类加载过程、内存管理、垃圾回收机制以及即时编译器等。通过了解JVM的工作原理࿰…...
同济子豪兄模板 半天搞定图像分类
同济子豪兄模板 半天搞定图像分类 ‘’import cv2 import numpy as np import time from tqdm import tqdm 视频逐帧处理代码模板 不需修改任何代码,只需定义process_frame函数即可 def generate_video(input_path‘videos/robot.mp4’): filehead input_path.…...

接口自动化测试,Fiddler使用抓包辅助实战,一篇彻底打通...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、快捷设置&…...

概念解析 | 隐式神经表示:揭开神经网络黑盒的奥秘
注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:隐式神经表示(Implicit Neural Representations) 隐式神经表示:揭开神经网络黑盒的奥秘 近年来,神经网络在各种任务上取得了惊人的进步,但其内部表示方式依然难以解读,被称为“…...
深入浅出PHP封装根据商品ID获取淘宝商品详情数据方法
要通过淘宝的API获取商品详情,您可以使用淘宝开放平台提供的接口来实现。以下是一种使用PHP编程语言实现的示例,展示如何通过淘宝开放平台API获取商品详情: 首先,确保您已注册成为淘宝开放平台的开发者,并创建一个应用…...

自动切换HTTP爬虫ip助力Python数据采集
在Python数据采集中,如果你需要爬取一些网站的数据,并且需要切换IP地址来避免被封或限制,我们可以考虑以下几种方式来实现自动切换HTTP爬虫IP。 1. 使用代理服务器 使用代理服务器是常见的IP切换技术之一。你可以购买或使用免费的代理服务器…...

20230811导出Redmi Note12Pro 5G手机的录音机APP的录音
20230811导出Redmi Note12Pro 5G手机的录音机APP的录音 2023/8/11 10:54 redmi note12 pro 录音文件 位置 貌似必须导出录音,录音的源文件不知道存储到哪里了! 参考资料: https://jingyan.baidu.com/article/b87fe19e9aa79b1319356842.html 红…...

Python-OpenCV中的图像处理-傅里叶变换
Python-OpenCV中的图像处理-傅里叶变换 傅里叶变换Numpy中的傅里叶变换Numpy中的傅里叶逆变换OpenCV中的傅里叶变换OpenCV中的傅里叶逆变换 DFT的性能优化不同滤波算子傅里叶变换对比 傅里叶变换 傅里叶变换经常被用来分析不同滤波器的频率特性。我们可以使用 2D 离散傅里叶变…...

8.10 用redis实现缓存功能和Spring Cache
什么是缓存? 缓存(Cache), 就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码。 通过Redis来缓存数据,减少数据库查询操作; 逻辑 每个分类的菜品保存一份缓存数据 数据库菜品数据有变更时清理缓存数据 如何将商品数据缓存起…...

SPI协议个人记录
SPI协议 SPI(Serial Peripheral Interface)是一种同步串行接口技术,由Motorola公司推出。SPI总线系统是一种同步串行外设接口,允许MCU与各种外围设备以串行方式进行通信和数据交换。外围设备包括FLASHRAM、A/D转换器、网络控制器…...

【深度学习 video detect】Towards High Performance Video Object Detection for Mobiles
文章目录 摘要IntroductionRevisiting Video Object Detection BaselinePractice for Mobiles Model Architecture for MobilesLight Flow 摘要 尽管在桌面GPU上取得了视频目标检测的最近成功,但其架构对于移动设备来说仍然过于沉重。目前尚不清楚在非常有限的计算…...

时序预测 | MATLAB实现EEMD-LSTM、LSTM集合经验模态分解结合长短期记忆神经网络时间序列预测对比
时序预测 | MATLAB实现EEMD-LSTM、LSTM集合经验模态分解结合长短期记忆神经网络时间序列预测对比 目录 时序预测 | MATLAB实现EEMD-LSTM、LSTM集合经验模态分解结合长短期记忆神经网络时间序列预测对比效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 时序预测 | …...

【软件工程】面向对象方法-RUP
RUP(Rational Unified Process,统一软件开发过程)。 RUP特点 以用况驱动的,以体系结构为中心的,迭代增量式开发 用况驱动 用况是能够向用户提供有价值结果的系统中的一种功能用况获取的是功能需求 在系统的生存周期中…...
Golang 的面向对象
文章目录 duck typingnil不一定是空接口组合代替继承接口转换回具体的类型使用switch匹配接口的原始类型 duck typing golang中实现某个接口不需要像其它语言使用 implemet 去继承实现,而是只要你的结构体包含接口所需的方法即可 package mainimport "fmt&qu…...

STABLE DIFFUSION模型及插件的存放路径
记录下学习SD的一些心得,使用的是秋叶大佬的集成webui,下载了之后点击启动器即可开启,文件夹中的内容如下 主模型存放在models文件下的stable-diffusion文件夹内,一些扩展类的插件是存放在extensions文件夹下...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...