当前位置: 首页 > news >正文

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整合&#xff0c;不过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" 即可...

案例练习:演讲比赛

演讲比赛: 比赛规则&#xff1a; 某市举行一场演讲比赛&#xff08; speech_contest &#xff09;&#xff0c;共有 24 个人参加。比赛共三轮&#xff0c;前两轮为淘汰赛&#xff0c;第三轮为决赛。 比赛方式&#xff1a;分组比赛&#xff0c;每组 6 个人&#xff1b;选手每次…...

推荐一个很好用的Latex写代码的软件

软件名称&#xff1a;Axmath 据说是国产软件&#xff0c;好用是真好用&#xff08;去哪找&#xff1f;比如某地球号的公主号或其他地方&#xff09;我是推荐付费购买使用 1.通过图形操作&#xff0c;选择要转成Latex代码的符号&#xff0c;按下转换&#xff0c;直接就出现了我…...

windows 程序右键管理员点击无响应

Windows 程序在右键单击以管理员身份运行时没有响应&#xff0c;可能是由于多种原因引起的。下面是一些常见的问题和解决方案&#xff1a; 1. 用户账户控制 (UAC) 设置问题&#xff1a; - 试着降低或提高 UAC 设置&#xff0c;然后再试一次。可以在控制面板的“用户账户”部…...

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

开发基于Java语言的SaaS&#xff08;Software-as-a-Service&#xff0c;软件即服务&#xff09;模式的HIS系统详解 HIS系统源码 支持二开 开发基于Java语言的SaaS&#xff08;Software-as-a-Service&#xff0c;软件即服务&#xff09;模式的HIS&#xff08;Hospital Informat…...

关于微信小程序(必看)

前言 为规范开发者的用户个人信息处理行为&#xff0c;保障用户的合法权益&#xff0c;自2023年9月15日起&#xff0c;对于涉及处理用户个人信息的小程序开发者&#xff0c;微信要求&#xff0c;仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则…...

Activity中Context

Activity中Context在activity.attach()设置&#xff0c;所以Application中Context为ContextImpl appContext createBaseContextForActivity(r);&#xff0c;即在ContextImpl.createActivityContext()设置DispalyId private ContextImpl createBaseContextForActivity(Activit…...

位图法-有效的数独

有效的数独&#xff0c;主要是判断每行每列每宫有无重复元素。 每行每列用二重循环&#xff0c;每宫比较复杂&#xff0c;需要考虑每一宫的坐标与二重循环ij对应关系 行i&#xff0c;每一宫3行&#xff0c;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语言完整学习资料&#xff0c;我整理了一些Golang方面的知识&#xff0c;方便大家学习。内容从最基础的入门到项目设计&#xff0c;希望帮助更多想了解和学习Go语言的伙伴。 因为是持续创作&#xff0c;所以也会持续更新。有些章节目录还没有…...

MyBatis常用转义字符 大于、小于、大于等于、小于等

在Mybatis编写特殊常用字符你会发现会报错,比如常用的<,>,<,> 等&#xff0c;原因是与xml文件的元素<>冲突&#xff0c;所以需要转义。整理转义字符如下&#xff1a; 符号原始字符转义字符大于>>大于等于>>小于<<小于等于<<和&…...

Python --- 如何修改Jupyter Notebook在本地保存文件的默认路径?

如何修改Jupyter Notebook在本地保存文件的默认路径&#xff1f; 一直以来都比较喜欢jupter notebook&#xff0c;自从用了以后就爱上了。平时用的时候&#xff0c;因为大多都是临时调用&#xff0c;每次在界面里直接new一个新的file就开干。 曾经也想过我创建的这些python文件…...

大模型 舆情分析 数据构造 prompt提示词 经验分享 数据准备

最近在做舆情分析&#xff0c;需要执行比较复杂的任务流程&#xff08;例如同时执行人名识别、相关机构识别、90分类&#xff09;&#xff0c;传统Bert无法胜任&#xff0c;因此尝试使用大模型进行处理。 下面的一些提示词是我用来准备数据的&#xff0c;这些数据可以按照不同…...

这些已经死去的软件,依旧无可替代

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

SYD88xx使代码在RAM内存中执行/运行

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

基于支持向量机的垃圾邮件分类,使用SVM+flask+vue

sms-classify 基于支持向量机的垃圾邮件分类&#xff0c;使用SVMflaskvue 数据集和源码地址 数据集 SMS Spam Collection Data Set 来源于 UCI。样例被分为非垃圾邮件&#xff08;86.6%&#xff09;和垃圾邮件&#xff08;13.4%&#xff09;&#xff0c;数据格式如下&#xff…...

目标检测数据集 - 零售食品LOGO检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;零售食品 LOGO 检测数据集&#xff0c;真实零售食品 LOGO 高质量商品图片数据&#xff0c;数据集含常见零售食品 LOGO 图片&#xff0c;包括饮料类、酒类、调味品类、膨化饼干类、巧克力类、常见零食类等等。数据集类别丰富&#xff0c;标注标签包含 150…...

47.PyCharm P版突然无法启动

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

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...