1. 什么是 Spring AOP?
Spring AOP 与 AOP 就如果 IOC(思想:控制反转) 和 DI (具体实现:依赖注入) ,其中AOP是思想,Spring AOP是具体实现。
AOP 是⼀种思想, Spring AOP 是⼀个框架,提供了⼀种对 AOP 思想的实现。
1.1 AOP
AOP(Aspect Oriented Programming):⾯向切⾯编程,它是⼀种思想,它是对某⼀类事情的集中处理。
AOP:面向切面编程,与OOP(面向对象编程)类似但又不互斥,可以说AOP是OOP的一种拓展与补充。
⽐如⽤户登录权限的效验,没用 AOP 之前,我们所有需要判断⽤户登录的⻚⾯(中的⽅法),都要各⾃实现或调⽤⽤户验证的⽅法,然⽽有了 AOP 之后,我们只需要在某⼀处配置⼀下,所有需要判断⽤户登录⻚⾯(中的⽅法)就全部可以实现用户登录验证了,不再需要每个⽅法中都写相同的⽤户登录验证了。
1.2 使用 AOP 的场景
如在判断用户是否登录的场景中,一个网站项目中,除了登录和注册这两个页面不用判断用户登录状态,此外的诸多页面都需要使用同样的方式来判断用户是否登录,这些判断方法都是相同的,这么多的方法就会增加代码的维护和修改的成本;
对于这种功能的统一,且使用的地方较多的功能,就可以考虑 AOP 来进行统一处理了。
除了统⼀的⽤户登录判断之外,AOP 还可以实现:
- 统⼀⽇志记录
- 统⼀⽅法执⾏时间统计
- 统⼀的返回格式设置
- 统⼀的异常处理
- 事务的开启和提交等
也就是说使⽤ AOP 可以扩充多个对象的某个能⼒,所以 AOP 可以说是 OOP(Object OrientedProgramming,⾯向对象编程)的补充和完善。
2. AOP 组成
AOP 组成的官方概念很难理解,这里给出官网解释(不加粗)和博主个人理解解释(加粗)
2.1 切面(Aspect)
切⾯(Aspect)由切点(Pointcut)和通知(Advice)组成,它既包含了横切逻辑的定义,也包括了连接点的定义。
切面:定义 AOP 是针对哪个统一的功能的,这个功能就叫做一个切面,比如用户登录功能或方法的统计日志,他们就各是一个切面。切面是由 切点 +通知 组成的。切⾯是包含了:通知、切点和切⾯的类,相当于 AOP 实现的某个功能的集合。
2.2 连接点(Join Point)
应⽤执⾏过程中能够插⼊切⾯的⼀个点,这个点可以是⽅法调⽤时,抛出异常时,甚⾄修改字段时。切⾯代码可以利⽤这些点插⼊到应⽤的正常流程之中,并添加新的⾏为。
连接点:所有可能触发 AOP (拦截方法的点) 就称为连接点;连接点相当于需要被增强的某个 AOP 功能的所有方法。
2.3 切点(Pointcut)
Pointcut 是匹配 Join Point 的谓词。
Pointcut 的作⽤就是提供⼀组规则(使⽤ AspectJ pointcut expression language 来描述)来匹配 Join Point,给满⾜规则的 Join Point 添加 Advice。
切点:用来定义 AOP 拦截的规则的 ;切点相当于保存了众多连接点的⼀个集合(如果把切点看成⼀个表,而连接点就是表中⼀条⼀条的数据)。
2.4 通知(Advice)
切⾯也是有⽬标的 ——它必须完成的⼯作。在 AOP 术语中,切⾯的⼯作被称之为通知。
通知:定义了切⾯是什么,何时使⽤,其描述了切⾯要完成的⼯作,还解决何时执⾏这个⼯作的问题。
通知:规定 AOP 执行的时机和执行的方法;
Spring 切⾯类中,可以在⽅法上使⽤以下注解,会设置⽅法为通知⽅法,在满⾜条件后会通知本⽅法进⾏调⽤:
-
前置通知使用 @Before:通知⽅法会在⽬标⽅法调⽤之前执⾏。
-
后置通知使用 @After:通知⽅法会在⽬标⽅法返回或者抛