Spring第七天(AOP)
简介
AOP(Aspect Oriented Programing)面向切面编程,一种编程范式,指导开发者如何组织程序结构
作用
在不惊动原始设计的基础上为其进行功能增强
Spring理念:无入侵式/无侵入式
基本概念
连接点(JoinPoint) : 程序执行过程中的任意位置,粒度为执行方法、抛出异常、设置变量等
在SpringAOP中,理解为方法的执行
切入点(Pointcut) : 匹配连接点的式子
在SpringAOP中,一个切入点只描述一个具体方法,也可以匹配多个方法
一个具体方法:e.g.:dao类中的save方法
匹配多个方法:所有的save方法,所有以get开头的方法,所有以Dao结尾的接口中的任 意方法,所有带有一个参数的方法
通知(Advice) : 在切入点执行的操作,也就是共性功能
在SpringAOP中,功能最终以方法的形式呈现
通知类:定义通知的类
切面(Aspect) : 描述通知与切入点的对应关系
实现案例
第一步、导入相关坐标
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10.RELEASE</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version></dependency></dependencies>
第二步、定义dao接口与其实现类
package com.cacb.dao.impl;import com.cacb.dao.BookDao;
import org.springframework.stereotype.Repository;@Repository
public class BookDaoImpl implements BookDao {@Overridepublic void save() {System.out.println(System.currentTimeMillis());System.out.println("BookDao saving!");}@Overridepublic void update() {System.out.println("BookDao updating!");}
}
第三步、定义通知类,制作通知
public class MyAdvice {public void method(){System.out.println(System.currentTimeMillis());}
}
第四步、在通知类中定义切入点
public class MyAdvice {@Pointcut("execution(void com.cacb.dao.BookDao.update())")private void pt(){}public void method(){System.out.println(System.currentTimeMillis());}
}
注:
切入点定义依托一个不具有实际意义的方法进行,即无参数,无返回值,方法体无实际逻辑
第五步、在通知类中绑定切入点预通知关系,并指定通知添加到原始连接点的具体执行位置
public class MyAdvice {@Pointcut("execution(void com.cacb.dao.BookDao.update())")private void pt(){}@Before("pt()")public void method(){System.out.println(System.currentTimeMillis());}
}
第六步、定义通知类受Spring容器管理,并定义当前类为切面类
@Component
@Aspect
public class MyAdvice {@Pointcut("execution(void com.cacb.dao.BookDao.update())")private void pt(){}@Before("pt()")public void method(){System.out.println(System.currentTimeMillis());}
}
第七步、在Spring核心配置文件中开启Spring对AOP注解驱动支持
@Configuration
@ComponentScan("com.cacb")
@EnableAspectJAutoProxy
public class SpringConfig {
}
AOP工作流程
1.Spring容器启动
2.读取所有切面配置中的切入点
3.初始化Bean,判定Bean对应的类中的方法是否匹配到任意切入点
匹配失败,则创建对象
匹配成功,则创建原始对象(目标对象)的代理对象
4.获取Bean执行方法
获取Bean,调用方法并执行,完成操作
获取的Bean是代理对象时,根据代理对象的运行模式运行原始方法与增强的内容,完成操作
目标对象(Target) : 原始功能去掉共性功能对应的类产生的对象,这种对象是无法直接完成最终工作的
代理(Proxy) : 目标对象无法直接完成工作,需要对其进行功能回填,通过原始对象的代理对象实现
APO切入点表达式
切入点:要进行增强的方式
切入点表达式:要进行增强的方法的描述方式
以上例update()方法为例,共有两种描述方式
方式一:接口方式
@Pointcut("execution(void com.cacb.dao.BookDao.update())")
方式二:实现类方式
@Pointcut("execution(void com.cacb.dao.impl.BookDaoImpl.update())")
切入点表达式标准格式:动作关键字(访问修饰符 返回值 包名.类/接口名.方法名 (参数)异常名)
动作关键字:描述切入点的行为动作,例如execution表示执行到指定切入点
访问修饰符:public,private等,可以省略
异常名:方法定义中抛出指定异常,可以省略
通配符
可以使用通配符描述切入点,快速描述
* 单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配符出现
execution(public * com.cacb.*.UserService.find* (*))
匹配com.cacb包下的任意包中的UserService类或接口中所有find开头的带有一个参数的方法
.. 多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写
execution(public User com..UserService.findById (..))
匹配com包下的任意包中的UserService类或者接口中的所有名称为findById的方法
+ 专用于匹配子类类型
execution(* * ..*Service+.* (..))
AOP通知类型
AOP通知描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到合理的位置
AOP通知共分为五种类型
前置通知
@Before("")
后置通知
@After("")
环绕通知
@Around("")public void around(ProceedingJoinPoint pjp) throws Throwable{//..原方法前操作pjp.proceed(); //表述对原始操作的调用//..原方发后操作}
如果原方法有返回值
@Around("")public Object around(ProceedingJoinPoint pjp) throws Throwable{//..原方法前操作Object result = pjp.proceed(); //表述对原始操作的调用//..原方法后操作return result}
返回后通知
@AfterReturning("")
只有在调用方法没有抛出异常,正常运行结束后该通知才会运行
抛出异常后通知
@AfterThrowing("")
只有在调用方法抛出异常后才会运行
@Around注意事项
1.环绕通知必须依赖形参ProceedingJoinPoint才能实现对原始方法的调用,进而实现原始方法调用前后同时添加通知
2.通知中如果未使用ProceedingJoinPoint对原始方法进行调用将跳过原始方法的执行
3.对原始方法的调用可以不接收返回值,通知方法设置成void即可,如果接收返回值,必须设定为Object类型
4.原始方法的返回值如果是void类型,通知方法的返回值类型可以设置成void,也可以设置成Object
5.由于无法预知原始方法运行后是否会抛出异常,因此环绕通知方法必须抛出Throwable对象
AOP通知获取数据
获取参数
JoinPoint:适用于前置、后置、返回后、抛出异常后通知

ProceedingJoinPoint:适用于环绕通知

获取返回值
返回后通知
环绕通知

获取异常
抛出异常后通知
环绕通知
相关文章:
Spring第七天(AOP)
简介 AOP(Aspect Oriented Programing)面向切面编程,一种编程范式,指导开发者如何组织程序结构 作用 在不惊动原始设计的基础上为其进行功能增强 Spring理念:无入侵式/无侵入式 基本概念 连接点(JoinPoint) : 程序执行过程中的任意位置&a…...
【0247】PG内核checkpoint实现机制分析(2)
文章目录 1. 前言2. checkpoint2.1 checkpoint工作机制2.2 项目实战3. 故障恢复(recovery)3.1 故障模拟3.2 规章恢复相关文章:...
单例模式分享
Java的单例模式详解与案例解析 单例模式是一种常见的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在Java中,实现单例模式有多种方式,我们将深入讨论其中的几种,并通过丰富的案例演示它们的用法。 1. 饿…...
Linux查找日志常用命令
tail tail命令常使用选项-f -f, --follow[{name|descriptor}]output appended data as the file grows;an absent option argument means descriptor例如: tail -1000f sys.log按回车键增加空白行,按Ctrl C 结束 vi / vim vi 文件名 如:…...
中国国际光伏展
中国国际光伏展是一个专注于光伏技术和行业的展览会。该展览会每年在中国举办,吸引了来自全球各地的光伏企业、专业人士和观众参加。 中国国际光伏展展览的主要内容包括光伏组件、光伏电池、光伏逆变器、光伏并网系统、光伏材料、光伏维护和管理等。展览会同时举办一…...
openai assistants api接入微信机器人,实现类GPTs功能
chatgpt网址:https://chat.xutongbao.top 比普通gpt多了代码解释器功能,和上传训练数据文件的功能,这两个功能就是GPTs拥有的,而普通gpt没有拥有的...
性能优化-OpenCL kernel 开发
「发表于知乎专栏《移动端算法优化》」 本文主要介绍OpenCL的 Kernel,包括代码的实例以及使用注意的详解。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能(HPC)开发基础教…...
systick定时器
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:…...
Unity学习-逐帧图集动画制作
首先在文件部分创建一个Sprite Library Asset 然后点击创建出来的文件 点下面的加号添加对应的图 添加完成之后点一下Apply 然后新建一个物体 添加这三个组件 其中SpriteLibrary里面 把你刚刚创建的图集文件拉过来 Sprite Resolver选择对应的动作和图片 然后开始制作动画 An…...
鸿蒙使用第三方SO库
一、示例: 使用第三方SO库以导入OpenCV和MNN的SO库为例 1、将MNN和Opencv的so文件(包括.407文件),放入模块下libs目录对应的版本(arm64-v8a和armeabi-v7a) entry/libs/arm64-v8a/xxx.so2、配置模块目录下的build-profile.json5的buildOption字段&…...
宝塔FTP文件传输服务结合cpolar内网穿透实现远程连接本地服务
⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 文章目录 ⛳️ 推荐1. Linux安装Cpolar2. 创建FTP公网地址3. 宝塔FTP服务设置4. FTP服务远程连接小结 5. 固定FTP公网地址6. 固…...
【ARMv8M Cortex-M33 系列 7.4 -- 如何使能 usagefault | memmange fault | bus fault 中断】
请阅读【嵌入式开发学习必备专栏 之 ARM Cortex-Mx专栏】 文章目录 背景异常使能配置 背景 由于文章【ARMv8M Cortex-M33 系列 7.2 – HardFault 问题定位 1】 中提到了HardFault 的发生是由于其它异常所升级导致的,所以就需要调查下如何是能其它异常中断。 异常使…...
Android Studio安卓开发--ListView学习整理
ListView允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕。 1.ListView的简单用法 (1)activity_main.xml布局中加入ListView控件:(先占满整个布局的空间)…...
hyperf 和 laravel、lumen防止xss攻击中间件封装
hyperf 防止xss攻击自定义中间件封装 <?phpdeclare(strict_types1);namespace App\Middleware;use Psr\Container\ContainerInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Message\ServerRequestInterface;…...
flask web 学习之用户认证与会话管理
文章目录 一、安装及初始化二、设置用户加载回调函数三、定义User类四、实现登陆操作五、自定义登陆过程六、使用请求加载器自定义登录七、匿名用户功能八、记住我功能 Flask-Login是一个用于处理用户认证和会话管理的Flask插件。它简化了在Flask应用程序中实现用户登录、登出以…...
更改wpf原始默认按钮的样式
样式 代码 <Window x:Class"WpfApp4.Window1"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/blend/2008…...
【协议】HTTP、HTTPS和HTTP2.0学习总结
1. TCP/IP四层协议 记得大学学网络课程的时候,学的都是OSI/RM七层协议,应用层 -> 表示层 -> 会话层 -> 传输层->网络层->数据链路层->物理层,当时学的时候,感觉太抽象了,学得个一知半解。大脑在接收…...
[数据结构]顺序表
1、顺序表的概念及结构 1.1 线性表 线性表( linear list )是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#…...
北斗卫星为野外科考人员提供安全保障
北斗卫星为野外科考人员提供安全保障 自第二次青藏高原综合科学考察研究启动以来,青海不断提升科考服务保障能力,推动科考全程信息化,有效促进科考成果转化。 为保障科考人员的人身安全,青海省青藏科学考察服务中心开发了基于北…...
Linux的一些快捷键(hot keyboard)
Ctrl Alt t:打开bash(就是命令框窗口) Ctrl Alt F3~F6:打开tty终端(纯命令行终端,每个Linux发行版不相同,我的是Ubuntu20版) Alt F4:关闭当前窗口(Windo…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
