SpringAop

devtools/2024/9/25 9:22:22/

SprinAOP的底层实现基于动态代理(JDK + CGLIB)。

AOP主要应⽤于⽇志记录,性能统计,安全控制,事务处理等⽅⾯,实现公共功能性的重复使⽤。

JDK动态代理

注:要求目标对象有接口实现

通过Proxy类的newProxyInstance()得到代理对象

Object proxy = Proxy.newProxyInstance(类加载器, 接口数组, InvocationHandler接口);

InvocationHandler接口中有invoke方法,代理过程在invoke方法中执行

当代理对象调用方法时,即会执行invoke方法

cglib 动态代理:

被代理⽬标对象可以不必实现接⼝,继承的⽅式实现。目标类不能使用final修饰。

需要在pom.xml引入cglib的依赖。

通过Enhancer的create方法,可以生成一个类,并设置该类的父类为目标类。

通过设置Enhancer对象的Callback方法,在callback方法中实现代理过程。

利用MethodInterceptor接口,该接口是Callback的子接口。

MethodInterceptor接口接口中,一个intercept方法,代理过程在intercept方法中执行

当代理对象调用方法时,即会执行intercept方法

AOP关键词

1. Joinpoint(连接点)被拦截到的每个点,spring中指被拦截到的每⼀个⽅法,spring aop⼀个连接点即代表⼀个⽅法的执⾏。

.2. Pointcut(切⼊点)对连接点进⾏拦截的定义(匹配规则定义 规定拦截哪些⽅法,对哪些⽅法进⾏处理),spring 有专⻔的表达式语⾔定义。

3. Advice(通知)拦截到每⼀个连接点即(每⼀个⽅法)后所要做的操作

        1. 前置通知 (前置增强)@Before  执⾏⽅法前通知 

        2. 返回通知(返回增强) @AfterReturning ⽅法正常结束返回后的通知

        3. 异常抛出通知(异常抛出增强)@AfterThrowing ⽅法抛出异常后的通知

        4. 最终通知 @After ⽆论⽅法是否发⽣异常,均会执⾏该通知 

        5. 环绕通知 @Around包围⼀个连接点(join point)的通知,如⽅法调⽤。这是最强⼤的⼀种通知类型。 环绕通知可以在⽅法调⽤前后完成⾃定义的⾏为。它也会选择是否继续执⾏连接点或直接返回它们⾃⼰的返回值或抛出异常来结束执⾏。

4. Aspect(切⾯)切⼊点与通知的结合,决定了切⾯的定义,切⼊点定义了要拦截哪些类的哪些⽅法,通知则定义了拦截过⽅法后要做什么,切⾯则是横切关注点的抽象,与类相似,类是对物体特征的抽象,切⾯则是横切关注点抽象。

5. Target(⽬标对象)被代理的⽬标对象

.6. Weave(织⼊)将切⾯应⽤到⽬标对象并⽣成代理对象的这个过程即为织⼊

7. Introduction(引⼊)在不修改原有应⽤程序代码的情况下,在程序运⾏期为类动态添加⽅法或者字段的过程称为引⼊

AOP的实现

.1. 坐标依赖引⼊

<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.9</version>
</dependency>

2. 添加spring.xml的配置

xmlns:aop="http://www.springframework.org/schema/aop" http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop.xsd

3. 注解实现定义切⾯

@Aspect 声明当前类是⼀个切⾯

@Pointcut("匹配规则")声明当前方法是一个切⼊点

匹配规则

1. 执⾏任意公共⽅法: * execution(public *(..)) 

2. 执⾏任意的set⽅法 * execution(* set*(..))

3. 执⾏com.xxxx.service包下任意类的任意⽅法 * execution(* com.xxxx.service.*.*(..))

4. 执⾏com.xxxx.service 包 以及⼦包下任意类的任意⽅法 * execution(* com.xxxx.service..*.*(..))   

表达式中的第⼀个* 代表的是⽅法的修饰范围 * 可选值:private、protected、public (* 表示所有范围) 

4. 配置⽂件

<aop:aspectj-autoproxy/>


http://www.ppmy.cn/devtools/116898.html

相关文章

React组件如何暴露自身的方法

一、研究背景 最近遇到一个如何暴露React组件自身方法的问题。在某些时候&#xff0c;我们需要调用某个组件内部的方法以实现某个功能&#xff0c;因此我们需要了解如何暴露组件内部API的方法。 二、实践过程 本文主要介绍React组件暴露子组件API的方法&#xff0c;以下是实…

关于前端vue3+element-plus项目正常安装运行时未报错,但是前端界面老是空白问题及解决方案(其他使用nodejs的框架同理)

框架介绍 整个项目使用了gin-vue-amdin前端是vue3element-plus 问题 前端npm install 安装成功后&#xff0c;并且npm run serve也成功运行&#xff08;控制台安装及运行没有任何报错信息&#xff09;。但是前端运行后&#xff0c;启动访问前端界面一直空白&#xff0c;但是…

Java List初始化的六种方式

在日常的开发中,List作为我们常用的一种数据结构,那么有谁了解过在Java中如何对一个List进行初始化操作。在这些初始化操作中又有哪些遇到的坑呢? 1、常规方式 List<String> languageList = new ArrayList<>(); languageList.add("Java"); language…

《数据压缩入门》笔记-Part 2

一篇文章显得略长&#xff0c;本文对应原书6-10章。序言、前言、第1-5章&#xff0c;请参考Part 1&#xff0c;第11-15章&#xff0c;请参考Part 3。 自适应统计编码 位置对熵的重要性 统计编码有一个问题&#xff1a;在编码开始之前都需要遍历一次数据&#xff0c;以计算出…

2024年_ChatGPT 及类似的人工智能技术带来的影响与改变 怎样利用 ChatGPT 提高学习效率

人工智能技术给我们带来了什么的改变&#xff1a; 工作方式与效率&#xff1a; 信息检索与处理&#xff1a;能快速整合大量信息&#xff0c;提供较为准确的答案和建议&#xff0c;帮助人们更高效地获取所需知识&#xff0c;提升信息检索和处理的速度与质量&#xff0c;比如在做…

点亮城市安全:高科技助力精准定位路灯漏电‘隐形杀手

在城市的每一个角落&#xff0c;路灯如同守夜人&#xff0c;默默照亮归家的路。然而&#xff0c;当这些守护者出现“漏电”隐患时&#xff0c;不仅威胁着行人的安全&#xff0c;还可能引发一系列电气故障。那么&#xff0c;如何精准快速地找出这些隐藏的漏电点&#xff0c;并有…

旋转矩阵乘法,自动驾驶中的点及坐标系变换推导

目录 1. 矩阵乘法的内项相消 2. 左右乘&#xff0c;内外旋与动静坐标系 3. 点变换 3.1 点旋转后的点坐标表示 3.2 坐标系旋转后的点坐标表示 4. 坐标变换的实质 1. 矩阵乘法的内项相消 关于旋转变换&#xff0c;离不开矩阵的乘法&#xff0c;而矩阵乘法的物理意义和本身数…