Spring AOP(统一功能处理)

1. 什么是Spring AOP?

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

AOP (Aspect Oriented Programming)︰面向切面编程,它是一种思想,它是对某一类事情的集中处理。比如用户登录权限的效验,没学AOP之前,我们所有需要判断用户登录的页面(中的方法),都要各自实现或调用用户验证的方法,然而有了AOP之后,我们只需要在某一处配置一下,所有需要判断用户登录页面(中的方法)就全部可以实现用户登录验证了,不再需要每个方法中都写相同的用户登录验证了。

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

2. 为什要用 AOP?

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

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

  • 统一日志记录
  • 统一方法执行时间统计
  • 统一的返回格式设置
  • 统一的异常处理
  • 事务的开启和提交等

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

3. Spring AOP 应该怎么学习呢?

Spring AOP学习主要分为以下3个部分:
1.学习AOP是如何组成的?也就是学习AOP组成的相关概念。
2.学习Spring AOP使用。
3.学习Spring AOP实现原理。下面我们分别来看。

3.1AOP组成

3.1.1 切面(Aspect)

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

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

3.1.2 连接点(Join Point)

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

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

3.1.3 切点(Pointcut)

Pointcut是匹配Join Point的谓词。

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

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

3.1.4 通知(Advice)

切面也是有目标的——它必须完成的工作。在AOP术语中,切面的工作被称之为通知。
通知︰定义了切面是什么,何时使用,其描述了切面要完成的工作,还解决何时执行这个工作的问题。

Spring切面类中,可以在方法上使用以下注解,会设置方法为通知方法,在满足条件后会通知本方法进行调用:

  • 前置通知使用@Before:通知方法会在目标方法调用之前执行。
  • 后置通知使用@After:通知方法会在目标方法返回或者抛出异常后调用。
  • 返回之后通知使用@AfterReturning:通知方法会在目标方法返回后调用。
  • 抛异常后通知使用@AfterThrowing:通知方法会在目标方法抛出异常后调用。
  • 环绕通知使用@Around:通知包裹了被通知的方法,在被通知的方法通知之前和调用之后执行自定义的行为。

切点相当于要增强的方法。
AOP整个组成部分的概念如下图所示,以多个页面都要访问用户登录权限为例:
在这里插入图片描述

3.2 Spring AOP实现

使用Spring AOP来实现一下AOP的功能,完成的目标是拦截所有UserController里面的方法,每次调用UserController中任意一个方法时,都执行相应的通知事件。

Spring AOP 的实现步骤是:

  1. 添加 AOP 框架支持。
  2. 定义切面和切点。
  3. 定义通知。

3.2.1 添加 AOP 框架支持

3.2.2 定义切面和切点。

3.2.3 定义相关通知

通知定义的是被拦截的方法具体要执行的业务,比如用户登录权限验证方法就是具体要执行的业务Spring AOP中,可以在方法上使用以下注解,会设置方法为通知方法,在满足条件后会通知本方法进行调用:

  • 前置通知使用@Before:通知方法会在目标方法调用之前执行。
  • 后置通知使用@After:通知方法会在目标方法返回或者抛出异常后调用。
  • 返回之后通知使用@AfterReturning:通知方法会在目标方法返回后调用。
  • 抛异常后通知使用@AfterThrowing:通知方法会在目标方法抛出异常后调用。
  • 环绕通知使用@Around:通知包裹了被通知的方法,在被通知的方法通知之前和调用之后执行自定义的行为。

具体实现如下:

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class UserAspect {
   
    // 定义切点⽅法
    @Pointcut("execution(* com.example.demo.controller.UserController.*
(..))")
    public void pointcut(){
    }
    // 前置通知
    @Before("pointcut()")
    public void doBefore(){
   
        System.out.println("执⾏ Before ⽅法");
    }
    // 后置通知
    @After("pointcut()")
    public void doAfter(){
   
        System.out.println("执⾏ After ⽅法");
    }
    // return 之前通知
    @AfterReturning("pointcut()")
    public void doAfterReturning(){
   
        System.out.println("执⾏ AfterReturning ⽅法");
    }
    // 抛出异常之前通知
    @AfterThrowing("pointcut()")
    public void doAfterThrowing()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值