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文件,加上以下代码后 今晨,无…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门  {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
