Spring面向切面编程AOP
大约 3 分钟
1. 介绍
面向切面编程(Aspect Oriented Programming,AOP)是一种通过预编译和运行期间动态代理实现程序的统一维护的一种技术,可以在不影响业务代码的情况下,为程序添加日志、鉴权等解耦功能
AOP的术语:
- 连接点(Jointpoint):程序中插入横切关注点的扩展点,Spring只支持方法执行连接点,也就是和方法有关的前后都是
- 切入点(Pointcut): 一个程序中会有多个连接点,但只想在一部分连接点上切入,切入的部分就叫切入点
- 通知(Advice):在连接点上执行的行为,通知提供了扩展现有行为的手段;包括:
- 前置通知(before advice):连接点前执行
- 后置通知(after advice):连接点正常返回的通知
- 异常通知(Around Advice):抛出异常的通知
- 环绕通知(around advice):可在方法调用前后进行自定义行为,可以阻断连接点继续执行、修改返回值或抛出异常
- 最终通知(finally advice):无论正常还是异常退出都会执行的通知
- 方面/切面(Aspect):通知、引入和切入点的组合
- 引入(inter-type declaration):允许向现有类添加新方法属性,也就是把切面应用到目标类
- 目标对象(Target Object):需要被织入横切关注点的对象,即该对象是切入点选择的对象,需要被通知的对象,从而也可称为被通知对象
- 织入(Weaving):把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象。这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入
- AOP代理(AOP Proxy):AOP框架使用代理模式创建的对象,从而实现在连接点处插入通知(即应用切面),就是通过代理来对目标对象应用切面。在Spring中,AOP代理可以用JDK动态代理或CGLIB代理实现,而通过拦截器模型应用切面。
2. Spring AOP和Aspect J
- Aspect J在编译时通过acj编译器将代码编译成class字节码实现增强的
- Spring的AOP是在运行时通过动态代理进行增强的
- 通过反射的Proxy:接口
- 通过继承的CGLIB:类
- AspectJ是更强的AOP框架,是实际意义的AOP标准
- Spring使用了AspectJ来做切入点解析和匹配,但最终运行还是Spring AOP
AOP | AspectJ |
---|---|
纯 Java | 使用 Java 编程语言的扩展实现 |
运行时织入 | 编译时、编译后和加载时织入 |
功能不强-仅支持方法级编织 | 更强大 - 可以编织字段、方法、构造函数、静态初始值设定项、最终类/方法等 |
性能低 | 性能高 |
简单 | 复杂 |