SpringBoot AOP切面编程

概念

当我们需要在许多类中添加相同逻辑(或记录等其他)代码的时候,一般我们编程会在每一个类中都写上这些代码。当需要修改的时候,我们又必须找出这些类来删除这些逻辑代码。将公共的代码抽取出来,当代码运行到指定位置时候,将公共代码切入相应的位置,即使用AOP的方式进行编程。使用的是代理机制,在不改变原程序的基础上对代码进行增强操作。日志记录,性能监控,异常处理这样的非核心功能,单独被抽取出来,与业务代码分离,横切在核心业务代码之上。AOP就是在某一个类或方法执行前后打个标记,声明在执行到这里之前要先执行什么,执行完这里之后要接着执行什么。

AOP需要明确三个问题:

  1. 在哪里切入,也就是权限校验等非业务操作在哪些业务代码中执行。where
  2. 在什么时候切入,是业务代码执行前还是执行后。when
  3. 切入后做什么事,比如做权限校验、日志记录等。what

术语

  • 通知(Advice):公共提取的代码,也就是想要增强的功能,例如校验、日志、事务等。
    • 前置增强:在指定方法之前运行
    • 后置增强:在指定方法之后运行
    • 环绕增强、异常抛出增强、最终增强等类型
  • 切入点(PointCut):决定处理如权限校验、日志记录等在何处切入业务代码中
  • 连接点(JoinPoint):连接点就是被拦截到的程序执行点,因为Spring只支持方法类型的连接点,所以在Spring中连接点就是被拦截到的方法。
  • 切面(Aspect):一个切面能够包含同一个类型的不同增强方法,比如说事务处理和日志处理可以理解为两个切面。切面由切入点和通知组成,它既包含了横切逻辑的定义,也包括了切入点的定义。
  • 目标对象(Target):目标对象指将要被增强的对象,即包含主业务逻辑的类对象。或者说是被一个或者多个切面所通知的对象。
  • 织入(Weaving):把切面应用到目标对象来创建新的代理对象的过程。

注解

@Aspect

@Aspect 注解用来描述一个切面类,定义切面类的时候需要打上这个注解。

@PointCut

@Pointcut 注解指定一个切点,定义切入的位置。被该注解修饰的方法就是切入的方法,该方法一般为空。
有两个常用的表达式需要知道如何使用:一个是使用 execution(),另一个是使用 annotation()。

execution表达式:
以 execution(* com.mutest.controller….(…))) 表达式为例:

  • 第一个 * 号的位置:表示返回值类型,* 表示所有类型。
  • 包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,在本例中指 com.mutest.controller包、子包下所有类的方法。
  • 第二个 * 号的位置:表示类名,* 表示所有类。
  • (…):这个星号表示方法名, 表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。

annotation() 表达式:
使用注解来定义

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

编程芝士

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

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

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

打赏作者

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

抵扣说明:

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

余额充值