SpringAOP详解+快速入门

SpringAOP是面向切面编程的实现,用于统一处理如日志、权限验证等跨功能需求。AOP包含切面、连接点、切入点和通知等概念。切点定义需增强的方法,通知定义增强的业务。SpringAOP基于动态代理,支持JDK和CGLIB两种代理方式。通过示例展示了如何配置和使用SpringAOP进行方法执行时间统计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.什么是SpringAOP?

2.为什么要使用AOP?

3.AOP的组成

    3.1 切面-Aspect

    3.2 连接点-JoinPoint

    3.3 切入点-Pointcut

    3.4 通知-Advice

4.SpringAOP简单实例展示

    4.1 添加AOP相关框架支持

    4.2 定义切面和切点

    4.3 定义相关通知

5.SpringAOP的实现原理

    5.1 JDK动态代理

    5.2 CGLIB代理

6.SpringAOP相关体系总结


1.什么是SpringAOP?

在介绍 Spring AOP 之前,首先要了解一下什么是 AOP?

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,它是一种思想,它是对某一类事情的集中处理。通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性和可维护性,同时提高了开发的效率。 

AOP 是一种思想,而 Spring AOP 是一个框架,提供了一种对 AOP 思想的实现,它们的关系和 IoC 与 DI 类似。

官方网站:春季AOP |春季AOP术语和春季AOP的需求 (educba.com)

 2.为什么要使用AOP?

想象一个场景,我们在做后台系统时,除了登录和注册等几个功能不需要做用户登录验证之外,其他几乎所 有页面调用的前端控制器( Controller)都需要先验证用户登录的状态,那这个时候我们要怎么处理呢?

我们之前的处理方式可能是每个 Controller 都要写一遍用户登录验证,然而当你的功能越来越多,那么你要写的 登录验证也越来越多,而这些方法又是相同的,这么多的方法就会代码修改和维护的成本。那有没有简单的 处理方案呢?答案是对于这种功能统一,且使用的地方较多的功能,就可以考虑 AOP 来统一处理 了。

除了统一的用户登录判断之外,AOP 还可以实现:

统一日志记录

统一方法执行时间统计

统一的返回格式设置

统一的异常处理

事务的开启和提交等

也就是说使用 AOP 可以扩充多个对象的某个能力,所以 AOP 可以说是 OOP(Object Oriented Programming,面向对象编程)的补充和完善。

3.AOP的组成

AOP 整个组成部分的概念如下图所示,以多个页面都要访问用户登录权限为例:

 3.1 切面-Aspect

切面(Aspect)由切点(Pointcut)和通知(Advice)组成,它既包含了横切逻辑的定义,也包括了连接点 的定义。

切面是包含了:通知、切点和切面的类,相当于 AOP 实现的某个功能的集合。

3.2 连接点-JoinPoint

应用执行过程中能够插入切面的一个点,这个点可以是方法调用时,抛出异常时,甚至修改字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。在Spring AOP中,一个连接点总是代表一个方法执行。

连接点相当于需要被增强的某个 AOP 功能的所有方法。

3.3 切入点-Pointcut

Pointcut 的作用就是提供一组规则(使用 AspectJ pointcut expression language 来描述)来匹配 Join Point,给满足规则的 Join Point 添加 Advice。

切点相当于保存了众多连接点的一个集合(如果把切点看成一个表,而连接点就是表中一条一条的数 据)。

3.4 通知-Advice

在 AOP 术语中,切面的工作被称之为通知

通知:定义了切面是什么,何时使用,其描述了切面要完成的工作,还解决何时执行这个工作的问题。 Spring 切面类中,可以在方法上使用以下注解,会设置方法为通知方法,在满足条件后会通知本方法进行调 用:

前置通知使用 @Before:通知方法会在(该注解的value)切入目标方法调用之前执行。

后置通知使用 @After: 通知方法会在(该注解的value)切入目标方法返回或者抛出异常之后调用。

返回之后通知使用 @AfterReturning: 通知方法会在目标方法正常执行完毕之后调用。

抛异常后通知使用 @AfterThrowing: 通知方法会在目标方法抛出异

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北~笙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值