9

什么是AOP

AOP:(Aspect Oriented Programming)面向切面编程。面向切面编程是一种编程范式,它作为OOP面向对象编程的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、权限控制、缓存控制、日志打印等等。

AOP 它是一种设计模式,用于实现一个系统中的某一个方面的应用。

image

AOP 好处

  • 每个事物逻辑位于一个位置, 代码不分散, 便于维护和升级
  • 业务模块更简洁, 只包含核心业务代码。
  • 侵入性少,增强代码可读性及可维护性。

AOP的术语

1.Join point(连接点)
Spring 官方文档的描述:

A point during the execution of a program, such as the execution of a method or the handling of an exception. In Spring AOP, a join point always represents a method execution.

程序执行过程中的一个点,如方法的执行或异常的处理。在Spring AOP中,连接点总是表示方法的执行。通俗的讲,连接点即表示类里面可以被增强的方法

2.Pointcut(切入点)
Spring 官方文档的描述:

Pointcut are expressions that is matched with join points to determine whether advice needs to be executed or not. Pointcut uses different kinds of expressions that are matched with the join points and Spring framework uses the AspectJ pointcut expression language

切入点是与连接点匹配的表达式,用于确定是否需要执行通知。切入点使用与连接点匹配的不同类型的表达式,Spring框架使用AspectJ切入点表达式语言。我们可以将切入点理解为需要被拦截的Join point

3.Advice(增强/通知)
所谓通知是指拦截到Joinpoint(连接点)之后所要做的事情就是通知,通知分为前置通知、后置通知、异常通知、最终通知和环绕通知(切面要完成的功能)

4.Aspect(切面)
Aspect切面表示Pointcut(切入点)和Advice(增强/通知)的结合

Advice注解

Advice注解一共有五种,分别是:
1.@Before前置通知
前置通知在切入点运行前执行,不会影响切入点的逻辑
2.@After后置通知
后置通知在切入点正常运行结束后执行,如果切入点抛出异常,则在抛出异常前执行
3.@AfterThrowing异常通知
异常通知在切入点抛出异常前执行,如果切入点正常运行(未抛出异常),则不执行
4.@AfterReturning返回通知
返回通知在切入点正常运行结束后执行,如果切入点抛出异常,则不执行
5.@Around环绕通知
环绕通知是功能最强大的通知,可以在切入点执行前后自定义一些操作。环绕通知需要负责决定是继续处理join point(调用ProceedingJoinPointproceed方法)还是中断执行

总结/理解

那么问题来了,什么是“面”?以及什么“面向切面编程”?

AOP被翻译成“面向切面编程”,所以这里我更倾向于将“面”理解为“切面”(Aspect)。

从字面上理解,“切面”来自几何学,在立体几何中,切面是指用一个平面去截一个几何体(包括圆柱,圆锥,球,棱柱,棱锥、长方体,正方体等等),得到的平面图形。

那什么是“面向切面编程”?就是在该切面上加入一些逻辑操作(可以简单理解为“对切面的操作”)。

举个例子:
比如 “斗地主”:
第一把不知道谁是地主,于是我们将一张牌,反过来查入到扑克牌当中。本来应该按照顺序摸牌,并不能知道谁是地主,但是因为你在某个位置插入了一个特殊操作(将一张牌反插入),因为多了一个逻辑(谁摸到这张反插的排,谁就是地主),所以可以知道谁是地主。

对“面向切面的编程”的最基础理解就是这样。


潘佳琦
894 声望34 粉丝

为 API 生,为框架死,为 debug 奋斗一辈子;