1、什么是面向切面编程?
- 概念:通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
2、AOP术语
2.1、通知(Advice)
- 在AOP术语中,切面的工作被称为通知、
- Spring切面可以应用5中类型的通知
- 前置通知(Before):在目标方法被调用之前用通知功能
- 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么。
- 返回通知(After-returning):在目标方法成功执行之后调用通知
- 异常通知(After-throwing):在目标方法抛出异常后调用通知。
- 环绕通知(Aroud):通知包裹了被通知的方法,在被通知的方法调用之前和之后执行自定义的行为。
2.2、切点
- 如果通知定义切面的‘什么’和‘何时’,那么切点就定义了‘何处’,切点的定义会匹配通知所要织入的一个过着额多个连接点。我们通常使用明确的类和方法名称,或者是利用正则表达式定义所匹配的类和方法名称来指定这些切点。
2.3、连接点
- 连接点是在应用执行过程中能够插入切面的一个点。我们的应用也有数千计时的时机应用通知,
- 这个点可以是在调用方法时、抛出异常时,甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。
2.4、切面
- 切面就是通知和切点的结合。通知和切点共同定义了切面的全部内容 – 它是什么,在合适和何处完成其功能。
3、Spring对AOP的支持
3.1、概念
- 创建切点来定义切面锁织入的连接点是AOP框架的基本功能。
3.2、 Spring提供了4种类型的AOP支持
- 基于代理的经典Spring AOP(笨重和过于复杂,基本弃用)
- 纯POJO切面(需要配置XML)
- @AspectJ注解驱动的切面(基于注解)
- 注入式AspectJ切面(适用于Spring各版本)
- 前三种都是Spring AOP 实现的辩题,Spring AOP构建在动态代理基础之上,因此,Spring对AOP的支持局限于方法拦截。
3.3、Spring在运行时通知对象
- Spring在运行期把切面织入到Spring管理的Bean中,并在代理类中包裹切面以及封装目标类,并拦截被通知方法的调用,再把调用转发给真正的目标bean。
- 当代理拦截到方法调用时,再调用目标bean发方法之前,会执行切面逻辑
- 只有在应用需要被代理的bean时,Spring才创建代理对象,所以我们不需要特殊的编译器来织入Spring