什么是AOP?
AOP(Aspect-Oriented Programming), 即 面向切面编程, 它与
OOP( Object-Oriented Programming, 面向对象编程) 相辅相成, 提供了与OOP 不同的抽象软件结构的视角. 在 OOP 中, 我们以类(class)作为我们的基本单元, 而 AOP 中的基本单元是 Aspect(切面)
那么什么是 Aspect呢?
aspect 由 pointcount 和 advice 组成, 它既包含了横切逻辑的定义, 也包
括了连接点的定义. Spring AOP 就是负责实施切面的框架, 它将切面所定义的横切逻辑编织到切面所指定的连接点中. AOP 的工作重心在于如何将增强编织目标对象的连接点上, 这里包含两个工作:
1、如何通过 pointcut 和 advice 定位到特定的 joinpoint 上
2、如何在advice 中编写切面代码.
什么是切点(JoinPoint)
程序运行中的一些时间点, 例如一个方法的执行, 或者是一个异常的处理. 在 Spring AOP 中, join point 总是方法的执行点。
什么是通知(Advice)?
特定 JoinPoint 处的 Aspect 所采取的动作称为 Advice。Spring AOP 使用一个 Advice 作为拦截器,在 JoinPoint “周围”维护一系列的拦截器。
有哪些类型的通知(Advice)?
-
Before - 这些类型的 Advice 在 joinpoint 方法之前执行,并使用
@Before 注解标记进行配置。 -
After Returning - 这些类型的 Advice 在连接点方法正常执行后执
行,并使用@AfterReturning 注解标记进行配置。 -
After Throwing - 这些类型的 Advice 仅在 joinpoint 方法通过抛出
异常退出并使用 @AfterThrowing 注解标记配置时执行。 -
After (finally) - 这些类型的 Advice 在连接点方法之后执行,无论方
法退出是正常还是异常返回,并使用 @After 注解标记进行配置。 -
Around - 这些类型的 Advice 在连接点之前和之后执行,并使用
@Around 注解标记进行配置。
AOP 有哪些实现方式?
静态代理
指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强;
编译时编织(特殊编译器实现)
类加载时编织(特殊的类加载器实现)。
动态代理
在运行时在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。
1. JDK 动态代理
2. CGLIB