004 AOP使用
文章目录
- 基于AspectJ的AOP的使用
- 添加依赖
- 编写目标类和目标方法
- 使用XML实现
- 实现步骤
- 切入点表达式
- 通知类型
- 使用注解实现
- 实现步骤
- 环绕通知注解配置
- 定义通用切入点
- 纯注解方式
基于AspectJ的AOP的使用
其实就是指的Spring+AspectJ整合,不过Spring已经将AspectJ收录到自身的框架中,并且底层织入依然是采取的动态织入方式
添加依赖
<!--基于AspectJ的aop依赖-->
<dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.0.7.RELEASE</version>
</dependency>
<dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId><version>1.0</version>
</dependency>
编写目标类和目标方法
- 编写接口和实现类(目标对象)
UserService接口
UserServiceImpl实现类
- 配置目标类,将目标类交给spring IoC容器管理
<context:component-scan base-package="sourcecode.ioc" />
使用XML实现
实现步骤
- 编写通知(增强类,一个普通的类)
public class MyAdvice {public void log(){System.out.println("记录日志...");}
}
- 配置通知,将通知类交给spring IoC容器管理
<!--配置通知、增强-->
<bean name="myAdvice" class="cn.spring.advice.MyAdvice"></bean>
- 配置AOP 切面
<!--配置通知、增强-->
<bean name="myAdvice" class="cn.spring.advice.MyAdvice"></bean><!-- AOP配置 -->
<aop:config><aop:aspect ref="myAdvice"><!-- method:指定要增强的方法,也就是指定通知类中的增强功能方法 --><!-- pointcut:指定切入点,需要通过表达式来指定--><aop:before method="log" pointcut="execution(void cn.spring.dao.UserDaoImpl.insert())"/></aop:aspect></aop:config>
切入点表达式
- 切入点表达式的格式
execution([修饰符] 返回值类型 包名.类名.方法名(参数))
- 表达式格式说明
execution:必须要
修饰符:可省略
返回值类型:必须要,但是可以使用*通配符
包名
多级包之间使用.分割
包名可以使用*代替,多级包名可以使用多个*代替
如果想省略中间的包名可以使用 ..
类名
可以使用*代替
也可以写成*DaoImpl
方法名
也可以使用*号代替
参数
参数使用*代替
如果有多个参数,可以使用..代替
通知类型
通知类型(五种):前置通知、后置通知、最终通知、环绕通知、异常抛出通知
- 前置通知:
执行时机:目标对象方法之前执行通知
配置文件:<aop:before method=“before” pointcut-ref=“myPointcut” />
应用场景:方法开始时可以进行校验
- 后置通知:
执行时机:目标对象方法之后执行通知,有异常则不执行了
配置文件:<aop:after-returning method=“afterReturning” pointcut-ref=“myPointcut” />
应用场景:可以修改方法的返回值
- 最终通知:
执行时机:目标对象方法之后执行执行通知,有没有异常都会执行
配置文件:<aop:after method=“after” pointcut-ref=“myPointcut” />
应用场景:例如像释放资源
- 环绕通知:
执行时机:目标对象方法之前和之后都会执行
配置文件:<aop:around method=“around” pointcut-ref=“myPointcut” />
应用场景:事务、统计代码执行时机
- 异常抛出通知:
执行时机:在抛出异常后通知
配置文件:<aop:after-throwing method=“afterThrowing” pointcut-ref=“myPointcut” />
应用场景:包装异常
使用注解实现
实现步骤
- 编写切面类(注意不是通知类,因为该类中可以指定切入点)
/**
* 切面类(通知+切入点)
*/
// @Aspect:标记该类是一个切面类
@Component("myAspect")
@Aspect
public class MyAspect {//@Before: 标记该方法是一个前置通知//value: 切入点表达式@Before(value = "execution(* *..*.*DaoImpl.*(..))")public void log() {System.out.println("记录日志...");}
}
- 配置切面类
<context:component-scan base-package="com.spring"/>
- 开启AOP自动代理
<!-- AOP基于注解的配置-开启自动代理 -->
<aop:aspectj-autoproxy />
环绕通知注解配置
@Around
作用:
把当前方法看成环绕通知。属性:
value:
用于指定切入点表达式,还可以指定切入点表达式的引用
@Around(value = "execution(* *.*(..))")
public Object aroundAdvice(ProceedingJoinPoint joinPoint) {//定义返回值Object rtValue = null;try {//获取方法执行所需的参数Object[] args = joinPoint.getArgs();//前置通知:开启事务beginTransaction()//执行方法rtValue = joinPoint.proceed(args);//后置通知:提交事务commit();} catch (Throwable e) {//异常通知:回滚事务rollback();e.printStackTrace();} finally {//最终通知:释放资源release();}return rtValue;
}
定义通用切入点
使用@PointCut注解在切面类中定义一个通用的切入点,其他通知可以引用该切入点
//@Aspect:标记该类是一个切面类
@Aspect
public class MyAspect {//@Before:标记该方法是一个前置通知//@Value:切入点表达式//@Before(value = "execution(* *..*.*DaoImpl.*(..))")@Before(value="MyAspect.fn()")public void log() {System.out.println("记录日志...");}//@Before(value = "execution(* *..*.*DaoImpl.*(..))")@Before(value="MyAspect.fn()")public void validate() {System.out.println("进行后台校验...");}//通过@Pointcut定义一个通用的切入点@Pointcut(value = "execution(* *..*.*DaoImpl.*(..))")public void fn() {}}
纯注解方式
@Configuration
@ComponentScan(basePackages="com.aaa")
@EnableAspectJAutoProxy
public class SpringConfiguration {
}
相关文章:
004 AOP使用
文章目录 基于AspectJ的AOP的使用添加依赖编写目标类和目标方法使用XML实现实现步骤切入点表达式通知类型 使用注解实现实现步骤环绕通知注解配置定义通用切入点 纯注解方式 基于AspectJ的AOP的使用 其实就是指的SpringAspectJ整合,不过Spring已经将AspectJ收录到自…...
Zookeeper 集群广播事务性能如何保证?
Zookeeper 集群广播事务性能如何保证? zookeeper是如何保证广播事务时,从开始到多数节点确认事务这个高效的? 在 Zookeeper 中,确保广播事务从开始到多数节点确认的高效性至关重要。Zookeeper 通过以下几个关键机制 和优化策略来实现这一目标: ZAB 协议(Zookeeper Atom…...
【vue解决el-input组件自动填充用户名密码】
解决el-input组件自动填充用户名密码 发现用autocomplete"off"并不能解决el-input组件自动填充密码的问题。 解决方法 auto-complete"new-password" 在el-input组件添加auto-complete"new-password" 即可...
案例练习:演讲比赛
演讲比赛: 比赛规则: 某市举行一场演讲比赛( speech_contest ),共有 24 个人参加。比赛共三轮,前两轮为淘汰赛,第三轮为决赛。 比赛方式:分组比赛,每组 6 个人;选手每次…...

推荐一个很好用的Latex写代码的软件
软件名称:Axmath 据说是国产软件,好用是真好用(去哪找?比如某地球号的公主号或其他地方)我是推荐付费购买使用 1.通过图形操作,选择要转成Latex代码的符号,按下转换,直接就出现了我…...
windows 程序右键管理员点击无响应
Windows 程序在右键单击以管理员身份运行时没有响应,可能是由于多种原因引起的。下面是一些常见的问题和解决方案: 1. 用户账户控制 (UAC) 设置问题: - 试着降低或提高 UAC 设置,然后再试一次。可以在控制面板的“用户账户”部…...

开发基于Java语言的SaaS(Software-as-a-Service,软件即服务)模式的HIS系统详解 HIS系统源码 支持二开
开发基于Java语言的SaaS(Software-as-a-Service,软件即服务)模式的HIS系统详解 HIS系统源码 支持二开 开发基于Java语言的SaaS(Software-as-a-Service,软件即服务)模式的HIS(Hospital Informat…...

关于微信小程序(必看)
前言 为规范开发者的用户个人信息处理行为,保障用户的合法权益,自2023年9月15日起,对于涉及处理用户个人信息的小程序开发者,微信要求,仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则…...
Activity中Context
Activity中Context在activity.attach()设置,所以Application中Context为ContextImpl appContext createBaseContextForActivity(r);,即在ContextImpl.createActivityContext()设置DispalyId private ContextImpl createBaseContextForActivity(Activit…...

位图法-有效的数独
有效的数独,主要是判断每行每列每宫有无重复元素。 每行每列用二重循环,每宫比较复杂,需要考虑每一宫的坐标与二重循环ij对应关系 行i,每一宫3行,3列 x3*(i/3)j/3 y3*(i%3)j%3...
Zookeeper ZNode 数据结构原理
ZNode 学习指南 1. ZNode 基本概念 什么是 ZNode:ZNode 是 Zookeeper 中的数据节点。它类似于文件系统中的文件和目录,ZNode 既可以保存数据又可以作为其他 ZNode 的父节点。ZNode 的路径:每个 ZNode 在 Zookeeper 命名空间中都有一个唯一的路径,如 /app1/config。2. ZNod…...
Golang - 90天从新手到大师
开篇 最近有很多小伙伴都在寻找go语言完整学习资料,我整理了一些Golang方面的知识,方便大家学习。内容从最基础的入门到项目设计,希望帮助更多想了解和学习Go语言的伙伴。 因为是持续创作,所以也会持续更新。有些章节目录还没有…...
MyBatis常用转义字符 大于、小于、大于等于、小于等
在Mybatis编写特殊常用字符你会发现会报错,比如常用的<,>,<,> 等,原因是与xml文件的元素<>冲突,所以需要转义。整理转义字符如下: 符号原始字符转义字符大于>>大于等于>>小于<<小于等于<<和&…...

Python --- 如何修改Jupyter Notebook在本地保存文件的默认路径?
如何修改Jupyter Notebook在本地保存文件的默认路径? 一直以来都比较喜欢jupter notebook,自从用了以后就爱上了。平时用的时候,因为大多都是临时调用,每次在界面里直接new一个新的file就开干。 曾经也想过我创建的这些python文件…...
大模型 舆情分析 数据构造 prompt提示词 经验分享 数据准备
最近在做舆情分析,需要执行比较复杂的任务流程(例如同时执行人名识别、相关机构识别、90分类),传统Bert无法胜任,因此尝试使用大模型进行处理。 下面的一些提示词是我用来准备数据的,这些数据可以按照不同…...

这些已经死去的软件,依旧无可替代
互联网这条长河里,软件们就像流星一样,一闪而过。有的软件火过一段时间,然后就慢慢消失了。 说不定有些软件你以前天天用,但不知道从什么时候开始就不再用了。时间一天天过去,我们的热情、记忆都在消退,还…...

SYD88xx使代码在RAM内存中执行/运行
SYD88xx使代码在RAM中执行 SYD8811/8810默认都是cache模式的,但是在代码首次运行的时候,需要将代码从flash搬到cache中执行,这样第一次的代码执行可能会比较慢,这里提供一个将需要提速的代码放到RAM中执行的方法。 对于SYD8811…...

基于支持向量机的垃圾邮件分类,使用SVM+flask+vue
sms-classify 基于支持向量机的垃圾邮件分类,使用SVMflaskvue 数据集和源码地址 数据集 SMS Spam Collection Data Set 来源于 UCI。样例被分为非垃圾邮件(86.6%)和垃圾邮件(13.4%),数据格式如下ÿ…...

目标检测数据集 - 零售食品LOGO检测数据集下载「包含VOC、COCO、YOLO三种格式」
数据集介绍:零售食品 LOGO 检测数据集,真实零售食品 LOGO 高质量商品图片数据,数据集含常见零售食品 LOGO 图片,包括饮料类、酒类、调味品类、膨化饼干类、巧克力类、常见零食类等等。数据集类别丰富,标注标签包含 150…...

47.PyCharm P版突然无法启动
目录 1.启动cmd.exe,进到pycharm\bin目录,启动.\pycharm.bat,如果正常,就像下面这个样子,如果不正常,则会报错, 2.用记事本打开pycharm.bat文件,加上以下代码后 今晨,无…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...

UE5 音效系统
一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类,将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix,将上述三个类翻入其中,通过它管理每个音乐…...

在Zenodo下载文件 用到googlecolab googledrive
方法:Figshare/Zenodo上的数据/文件下载不下来?尝试利用Google Colab :https://zhuanlan.zhihu.com/p/1898503078782674027 参考: 通过Colab&谷歌云下载Figshare数据,超级实用!!࿰…...