java Web-Spring AOP

AOP的概念

AOP:面向切面编程,面向方法编程。简单理解就是对特定方法的扩充的思想

例如我们要在特定方法进行方法的执行时间判断,我们假如去使用在每个方法去进行业务逻辑扩充,这样就太繁琐了,而使用AOP就可以简化操作。Spring AOP 底层是通过动态代理技术实现的,要想查看动态代理可以查看我之前的文章 动态代理技术。

AOP 的组成

切面

AOP 是面向 切面编程,所以这是 AOP 最重要的功能。定义 AOP 是针对哪个统一的功能,这个功能就叫做一个切面。比如用户登录功能或方法的统计日志,他们就各自是一个切面。切面是由 切点 和 通知组成的。

连接点
就是所有可能触发 AOP(拦截方法的点),就称为连接点。

切点
切点会提供一个规则,用来匹配连接点,并且来实现通知。也就是在何处执行通知。

通知
重复的共性功能就是通知。就是规定 AOP 执行的时机和执行的方法,就是切点处的执行动作通知注解如下:

前置通知: 使用 @Before,通知方法会在目标方法调用之前执行。
后置通知: 使用 @After,通知方法会在目标方法返回或者抛出异常后调用。
返回之后通知: 使用 @AfterReturning,通知方法会在目标方法返回后调用。有异常不调用
抛异常后通知: 使用 @AfterThrowing,通知方法会在目标方法抛出异常后调用。
环绕通知: 使用 @Around通知包裹了被通知的方法,在被通知的方法通知之前和调用之后,执行自定义的行为。注意:1.AOP方法内需要调用procedingJoinPoint.proceed();方法来执行原始方法。2.Around环绕通知的返回值必须指定为Object来接收原始方法返回值

使用步骤

1.导入AOP依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2.编写AOP程序 

1.定义模板方法类,加上注解@Component交给IOC容器管理,还要加上@Aspect注解声明这是一个AOP类。

2.声明切点并定义通知:使用@PointCut注解注解一个方法来声明切点,也可以直接把表达式放入通知注解的参数中接收来声明切点

//方式一
@pointcut("切入点表达式)")
private void pt(){}//声明切点

@Before("pt()")
public void beforeTest(){
loog.info("beforeTest");
}
//方式二

@Before("切入点表达式")
public void beforeTest(){
loog.info("beforeTest");
}

 通知的执行顺序

当有多个切面的切入点都匹配到了目标方法时,多个通知方法都会被执行。

默认情况下顺序和切面类的类名大小有关,before通知类名靠前的 先执行,after通知类名靠前的 后执行。

我们可以通过@Order(数字)注解加在AOP类上来指定切面类控制顺序,before通知类数字小的 先执行,after通知数字小的 后执行。

切入点表达式

1.execution(...)

根据方法的返回值,包名,类名,方法名,方法参数等信息来匹配

语法:

execution([访问修饰符] 返回值 [包名.(类名./接口名.)]方法名(方法参数,要填全类名) [throws 异常])

可以使用通配符描述切入点:

*: 单个独立的任意符号,可以通配任意返回值、包名、类名、方法名、任意类型的一个参数,也可以通配包、类、方法名的一部分

案例:

execution(* com .*. service .*. update*(*))

.. : 多个连续的任意符号,可以通配任意层级的包,或任意类型、任意个数的参数

案例:

execution(* com.test .. DeptService .* ( .. ))

想要同时匹配多个连接点,可以使用||来连接

execution(* com.test.service. DeptService.list ()) || execution(* com.test.service. DeptService.delete (java. lang. Integer) ) 

2.@annotation(...)

根据标识注解进行匹配

语法:

@annotation(注解的全类名)

1.首先自定义一个注解用来标记匹配方法

@Retention(RetentionPolicy.RUNTIME)//元注解,运行时有效
@Target(ElementType.METHOD)//元注解,注解属性为方法上
public @intetface Mytest{}

2.在要切入的方法上加上注解

@MyTest
@Override
public List<dept> list{
List<dept> deptList =deptMapper.list();
return deptList;
}

@MyTest
@Override
public List<dept> delete{
deptMapper.delete(id);
}

3.使用切入点表达式

连接点

在Spring中用JoinPoint抽象了连接点,用它可以获得方法执行时的相关信息,如目标类名、方法名、方法参数等。我们可以在形参中声明参数来获取到他的对象。

  • 对于@Around 通知,获取连接点信息只能使用 ProceedingJoinPoint
  • 对于其他四种通知,获取连接点信息只能使用JoinPoint,它是 ProceedingJoinPoint 的父类型
@Around("execution(...)")

public Object around(ProceedingJoinPoint joinPoint) throws Throwable {

String className= joinPoint.getTarget().getClass().getName();//获取目标类名

Signature signature = joinPoint.getSignature();//获取目标方法签名

String methodName= joinPoint.getSignature().getName();//获取目标方法名

Object[] args= joinPoint.getArgs();//获取目标方法运行参数

Object res =joinPoint.proceed();//执行原始方法,获取返回值(环绕通知)

return res;

}
@Before("execution(...)")

public void before(JoinPoint joinPoint) {

String className = joinPoint.getTarget().getClass().getName();//获取目标类名

Signature signature= joinPoint.getSignature();//获取目标方法签名

String methodName=joinPoint.getSignature().getName();//获取目标方法名

Object[] args=joinPoint.getArgs();//获取目标方法运行参数

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/573629.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mybatis中<if>条件判断带数字的字符串失效问题

文章目录 一、项目背景二、真实错误原因说明三、解决方案3.1针对纯数字的字符串值场景3.2针对单个字符的字符串值场景 四、参考文献 一、项目背景 MySQL数据库使用Mybatis查询拼接select语句中进行<if>条件拼接的时候&#xff0c;发现带数字的或者带单个字母的字符串失效…

vue基础教程(7)——构建项目级首页

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、页面结构二、侧边栏三、主体部分总结 前言 前面我们学习了vue的路由和登录页搭建&#xff0c;本文将和大家共同学习首页的搭建。 首页示例如图&#xff1a; 很多项目经验比较少的同学&#xff0c;一般都是对某些语…

架构师系列-消息中间件(八)- RocketMQ 进阶(二)-生产端消息保障

5. RocketMQ消息保障 下面我们详细说下如何保障消息不丢失以及消息幂等性问题 5.1 生产端保障 生产端保障需要从一下几个方面来保障 使用可靠的消息发送方式注意生产端重试生产禁止自动创建topic 5.1.1 消息发送保障 5.1.1.1 同步发送 发送者向MQ执行发送消息API时&#xff0…

springBoot集成flowable

前言 Flowable可以十分灵活地加入你的应用/服务/构架。可以将JAR形式发布的Flowable库加入应用或服务&#xff0c;来嵌入引擎。 以JAR形式发布使Flowable可以轻易加入任何Java环境&#xff1a;Java SE&#xff1b;Tomcat、Jetty或Spring之类的servlet容器&#xff1b; JBoss…

网工内推 | 上市公司网络运维,大专可投,NA/NP认证优先

01 珠海世纪鼎利科技股份有限公司 招聘岗位&#xff1a;网络运维工程师 职责描述&#xff1a; 1、负责服务器安装、维护和设备管理&#xff1b; 2、负责应用系统的部署&#xff0c;升级&#xff0c;维护&#xff1b; 3、分析网络数据&#xff0c;排查网络故障及事务的应急响应…

百度网盘svip白嫖永久手机2024最新教程

百度网盘&#xff08;原名百度云&#xff09;是百度推出的一项云存储服务&#xff0c;已覆盖主流PC和手机操作系统&#xff0c;包含Web版、Windows版、Mac版、Android版、iPhone版和Windows Phone版。用户将可以轻松将自己的文件上传到网盘上&#xff0c;并可跨终端随时随地查看…

【C语言】红黑树详解以及C语言模拟

一、红黑树的性质二、红黑树的旋转操作三、红黑树的插入操作四、红黑树的删除操作五、红黑树的应用六、C语言模拟红黑树七、总结 红黑树是一种自平衡二叉查找树&#xff0c;它能够保持树的平衡&#xff0c;从而确保查找、插入和删除的最坏情况时间复杂度为O( l o g n log_n log…

软考-系统集成项目管理中级--项目人力资源管理(输入输出很重要!!!本章可能包含案例题)

本章历年考题分值统计 本章重点常考知识点汇总清单(学握部分可直接理解记忆) 10、项目沟通管理计划一般应包括以下内容:(掌握)12上59&#xff0c;10下59&#xff0c;13上53&#xff0c;13上57,14下58&#xff0c;15下58&#xff0c;16上59 考题 (1)干系人的沟通需求。 (2)针对沟…

爬虫抓取网站数据

Fiddler 配置fiddler工具结合浏览器插件 配置fiddler Tools--Options 抓包技巧 谷歌浏览器开启无痕浏览,使用SwitchyOmega配置好代理端口 Ctrl x 清理所有请求记录,可以删除指定不需要日志方便观察 设置按请求顺序 观察cookie,观察请求hesder cookie和row返回结果 Swit…

C++/QT + Mysql + Tcp 企业协作管理系统

目录 一、项目介绍 二、项目展示 三、源码获取 一、项目介绍 1、项目概要&#xff1a;C/S架构、数据库Mysql、C、QT&#xff1b;支持实时通信、局域网内通信&#xff0c;可多个客户端同时登录&#xff1b; 2、&#xff08;Server&#xff09;管理端&#xff1a;用户管理、…

科技云报道:AIGC掀算力需求革命,边缘计算将不再“边缘”

科技云报道原创。 随着以大模型为代表的AIGC时代拉开序幕&#xff0c;算力需求持续爆发&#xff0c;AI与边缘深度融合已是大势所趋&#xff0c;越来越多的企业开始积极布局GenAI。 GenAI技术的商用化部署和应用成为企业竞逐的新阵地&#xff0c;勾勒出大模型从“技术力”转向…

数组模拟几种基本的数据结构

文章目录 数组模拟单链表数组模拟双链表数组实现栈数组模拟队列总结 数组模拟单链表 首先类比结构体存储单链表&#xff0c;我们需要一个存放下一个节点下标的数组&#xff0c;还需要一个存储当前节点的值的数组&#xff0c;其次就是一个int类型的索引&#xff0c;这个索引指向…

挑战一周完成Vue3实战项目硅谷甄选Day1:项目初始化、项目配置、项目集成

一、项目初始化 node v16.4.0以上&#xff08;查看node版本 : node -v&#xff09; pnpm 8.0.0&#xff08;npm i -g pnpm8.0.0&#xff09; 在想创建的位置新建文件夹自己命名 在此文件夹下cmd:pnpm create vite 选择如下配置 Project name&#xff08;项目名称&#xff0…

Java设计模式 _创建者模式_工厂模式(普通工厂和抽象工厂)

一、工厂模式 属于Java设计模式创建者模式的一种。在创建对象时不会对客户端暴露创建逻辑&#xff0c;并且是通过使用一个共同的接口来指向新创建的对象。 二、代码示例 场景&#xff1a;花店有不同的花&#xff0c;通过工厂模式来获取花。 1、普通工厂模式 逻辑步骤&#…

Spring - 5 ( 8000 字 Spring 入门级教程 )

一&#xff1a;Spring IoC&DI 1.1 方法注解 Bean 类注解是添加到某个类上的&#xff0c; 但是存在两个问题: 使用外部包里的类, 没办法添加类注解⼀个类, 需要多个对象, ⽐如多个数据源 这种场景, 我们就需要使用方法注解 Bean 我们先来看方法注解如何使用: public c…

AI-数学-高中-42导数的概念与意义

原作者视频&#xff1a;【导数】【一数辞典】1导数的概念与意义_哔哩哔哩_bilibili .a是加速度&#xff1b;

OpenAI 笔记:获取embedding

1 输入openai的api key from openai import OpenAIclient OpenAI(api_key**) 2 举例 response client.embeddings.create(input"Hello",model"text-embedding-3-small" )print(response.data[0].embedding) 默认情况下&#xff0c;text-embedding-3-s…

配置Linux【虚拟机】与 windows【宿主机】网络互通 (面向小白,简单操作)

1. 启动虚拟机&#xff0c;运行Linux系统 这里我使用 VMware Workstation Pro 来运行Linux系统&#xff08;cent-os7&#xff09;2. 鼠标右键打开终端 3. 输入 cd /etc/sysconfig/network-scripts , 然后输入ls &#xff0c;查看当前目录下的网卡 一般来说&#xff0c;虚拟机的…

计算机网络基础认识

本篇文章是我在B站上看到关于计算机网络的介绍视频收到的启发。本篇文章的内容来自【网络】半小时看懂<计算机网络>_哔哩哔哩_bilibili 一、物理层 从常理来说&#xff0c;进行连个设备之间的通讯&#xff0c;首先最容易想到的就是使用一根线连接两个设备进行通讯。但是…
最新文章