一.AOP基础概念
- 切面(Aspect):切面是跨越多个类的关注点模块化,如事务管理。切面由切点和通知组成。
- 连接点(Join Point):在程序执行过程中某个特定的点,如方法调用或异常抛出。在Spring AOP中,连接点通常是方法的执行点。
- 切点(Pointcut):用于定义哪些连接点会被增强/通知。切点表达式决定了通知被应用到哪些具体的方法上。
- 通知(Advice):在切面的某个特定连接点上执行的动作。通知类型包括前置通知、后置通知、返回通知、异常通知和环绕通知。
- 织入(Weaving):将切面应用到目标对象并创建代理对象的过程。Spring AOP是在运行时通过动态代理完成织入的。
- 引入(Introduction):允许向现有的类添加新方法或属性。
二.Spring AOP源码实现机制
概念:
Spring AOP主要通过动态代理技术实现,包括JDK动态代理和CGLIB代理。对于实现了接口的类,Spring默认使用JDK动态代理;对于没有实现接口的类,则使用CGLIB生成子类作为代理。
1. 代理对象的生成
代理对象的生成通常发生在Bean的初始化后阶段,由BeanPostProcessor
接口的实现类(如AnnotationAwareAspectJAutoProxyCreator
)负责。这个类会在Bean初始化后检查是否需要为Bean生成代理对象。如果需要,它会根据配置和Bean的类型选择合适的代理技术(JDK或CGLIB),并创建代理对象。
2. 代理方法的执行
当代理对象的方法被调用时,Spring AOP会根据配置的通知类型和切点表达式,决定在方法执行的前、后或抛出异常时执行哪些通知。这通常通过一个“责任链”模式实现,责任链中的每个节点代表一个通知,按照配置的顺序依次执行。
对于环绕通知,它会包裹目标方法的调用,在调用前后执行自定义的逻辑。环绕通知提供了最大的灵活性,因为它可以控制目标方法的执行流程(例如,可以决定是否继续执行目标方法)。
2.1源码分析
Spring AOP 主要基于两种⽅式实现的: JDK 及 CGLIB 的⽅式
Spring对于AOP的实现,基本上都是靠
AnnotationAwareAspectJAutoProxyCreator
去完成