springboot(4)

AOP

1.AOP与OOP

  • OOP(Object Oriented Programming,面向对象编程)

  • AOP(Aspect Oriented Programming,面向切面编程)

  • POP(Process Oriented Programming,面向过程编程)

  • FP(Functional Programming,函数式编程)

AOP的诞生就是为了弥补OOP(面向对象编程)的不足。面向对象非常擅长 解决纵向的业务逻辑,但是对于横向的公共操作却显得有些“力不从心”。

2.用在什么地方

AOP中的核心概念:

  • Advice(通知):想要让AOP做的事情.

  • JoinPoint(连接点):允许AOP通知的地方,比如,在方法被调用前 检查权限,这个“方法被调用前”就是一个JoinPoint.

  • Pointcut(切入点):用于筛选JoinPoint的条件。只有符合Pointcut 条件的JoinPoint才会执行Advice.

  • Aspect(切面):一个包含Advice和Pointcut的集合,完整地定义了 符合什么条件时做什么事。

要想知道AOP可以用在哪些场景,我们需要从AOP其中一个概念入手—— Advice(通知)。我们简单回顾一下。

  • Before:在目标方法执行前调用Advice

  • After[finally]:在目标方法执行完成后调用Advice

  • After-Returning:在目标方法成功执行后调用Advice

  • After-Throwing:在目标方法抛出异常后调用Advice

  • Around:一般解释为环绕/包裹目标方法调用Advice,是可定制化调用 的Advice

AOP的适用场景

Before可以在目标方法执行前做一些事情,如解析请求参数、进行权限检 查等;

After可以在目标方法执行完成后记录一些日志;

After-Returning可以 与Before配合计算目标方法执行时间;

After-Throwing可以在目标方法抛出异 常后做一些处理;

而Around基本上可以做以上所有的事情。

根据AOP的能力与特点,我们通常会在以下场景中使用AOP:

  • 参数检查

  • 日志记录

  • 异常处理

  • 性能统计

除了上面这些基础功能,还可以利用AOP做一些更加复杂的通用处理:

  • 事务控制

  • 缓存处理

  • 权限控制

案例

1.引入AOP依赖

 2.创建AspectController类

 3.创建一个切面类WebAspect:

 

4.在类上加上@Aspect注解,可以用来标识该类为一个AOP的切面。

日志记录

在AspectController类中添加如下接口:

 然后在WebAspect类中添加如下代码

 

before方法中获取了请求路径(path)、完整类路径、目标方法名、参数 信息。after方法中打印了目标方法名。afterReturning方法中打印了目标方 法的返回值。

@Pointcut用来定义切点;execution是用来匹配连接点的执行方法; public代表要匹配访问权限为public的方法;第一个代表返回值为任意 类型;com.shuijing.boot.aop为包路径;第二个代表前面包路径下的任 意类;第三个*代表任意方法;(..)代表任意参数。

4.执行顺序

  • 同一切面内的执行顺序

  • 不同切面间的执行顺序

同一切面内的执行顺序:

先执行 before方法,再执行afterReturning/afterThrowing方法,最后执行after方 法。around方法早于before方法开始执行,并且晚于after方 法结束执行,刚好将其他通知完全包裹了起来

不同切面间的执行顺序:

Spring中默认的执行顺序其实就是Bean初始化的顺序。而Spring中的加载顺序是根据类名升序 排列的,很明显,Three按字母排序会排在Two前面。@Order来解决顺序问题。

5.原理

Spring的AOP是用代理的方式实现的。每个切面都是Spring容器中的一个 Bean,在目标方法被调用时,Spring把切面应用到目标对象上,为目标对象动 态创建代理,这个过程叫作Weaving(织入)。切面会在指定(符合切点条 件)的连接点织入目标对象中。

当调用者调用目标对象时,调用请求会被代理类拦截,而在目标对象真正被调用之前,会先织入切面逻辑。当应用需要目标对象时, Spring才会创建代理对象,因为Spring采用的是运行期织入的实现方式。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络防御(2)

1. 什么是防火墙? 2. 状态防火墙工作原理? 3. 防火墙如何处理双通道协议? 一、什么是防火墙? 防火墙是一种网络安全设备或软件,用于保护计算机网络免受未经授权的访问,并管理网络流量。它作为一个安全边界…

抖音商品上架有攻略:详细介绍步骤与注意事项

抖音是一款非常流行的短视频分享平台,也是一个非常适合进行商品销售的平台。上架商品是在抖音上进行电商销售的重要一环,下面不若与众将介绍抖音商品的上架流程和注意事项。 1. 注册账号和认证:首先,你需要在抖音平台上注册一个账…

SQL 相关子查询 和 不相关子查询、Exists 、Not Exists、 多表连接(包含自连接)

不相关子查询 子查询的查询条件不依赖于父查询,称不相关子查询。子查询可以单独运行的 select stu_id,sex,age from student t where sex(select sexfrom studentwhere stu_id10023 )相关子查询 关联子查询 子查询的查询条件依赖于父查询,称为 相关子…

GD32F103的EXTI中断和EXTI事件

GD32F103的EXTI可以产生中断,也产生事件信号。 GD32F03的EXTI触发源: 1、I/O管脚的16根线; 2、内部模块的4根线(包括LVD、RTC闹钟、USB唤醒、以太网唤醒)。 通过配置GPIO模块的AFIO_EXTISSx寄存器,所有的GPIO管脚都可以被选作EXTI的触发源…

在线原型设计工具有好用的吗?就是这10个

随着设计工作的不断发展,原型设计在设计工作中越来越重要,而在线原型设计工具在减轻了设计师工作负担的同时也提高了设计师的工作效率,今天本文将为大家推荐10个能在线使用的原型设计工具,一起来看看吧! 1、即时设计 …

ZyjDataLink 全量MySQL同步程序 - 开发过程 01

开发过程由本人从 架构设计 到 代码实现 独立完成,通过该博客记录分享开发经验 ZyjDataLink 当前的目标是做到 MySQL大数据量的快速同步,后期希望扩展的功能 高度可操作性,融入增量数据库同步,跨数据库同步 ZyjDataLink 需求分析…

vue2-vue中mixin到底是什么?

1、mixin是什么? Mixin是面向对象程序设计语言中的类,提供了方法的实现。其他类可以访问mixin类的方法而不必成为其子类。 Mixin类通常作为功能模块使用,在需要该功能时“混入”,有利于代码的复用又避免了多继承的复杂。 1.1 vue中…

Redis储存结构

Redis怎么储存的 这个redisDb是数据库对象 里面的其他字段忽略了 然后里面有个dict列表(字典列表) 我们随便来看一个redisObject 区分一下子啊 他这个dict里面没有存redisObject的对象 也没有存dict对象 它只是存了个数据指针 你看那个redis每个底层编码 抠搜的 这块要是再保存…

门面模式(C++)

定义 为子系统中的一组接口提供一个一致(稳定) 的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用)。 应用场景 上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子…

Java数据类型,一文带你彻底拿捏~

——Java中运算符是一种特殊的符号,用来进行数据的运算、赋值和比较等 思维导图 一.算术运算符 1.什么是算术运算符 ——算术运算符是用于数据类型值之间,使用2个或以上的数据进行运算 2.算术运算符概括 算术运算符 解释示例,-正号&…

面试热题(滑动窗口最大值)

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 输入:nums [1,3,-1,-3,5,3,6,7], k 3 输出:[3,3,5,…

后端进阶之路——深入理解Spring Security配置(二)

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄,vue成神之路★ ★ 解决算法,一个专栏就够了★ ★ 架…