Spring AOP

Spring AOP 详细笔记(含核心思想及Advisor相关概念)


0. AOP 核心思想

  • 在不修改源代码的情况下,通过动态代理实现方法增强。

  • 将系统中与业务无关的“横切关注点”(如日志、事务、安全等)模块化,统一管理和复用。

  • 通过“切面”(Aspect)将增强逻辑从业务逻辑中分离,实现关注点分离(Separation of Concerns)。


1. AOP 核心概念

名称说明
Aspect(切面)增强逻辑的模块,封装了通知和切点的集合
Advice(通知)切面中具体的增强动作,比如前置通知、后置通知、环绕通知等
Join Point(连接点)程序执行过程中的某个点(通常是方法调用点)
Pointcut(切点)匹配 Join Point 的表达式,定义在哪些连接点应用通知
Advisor(通知者)Advice 和 Pointcut 的组合,Spring AOP中用Advisor统一管理通知和切点
Target Object(目标对象)被代理的对象,包含业务逻辑的原始对象
Proxy Object(代理对象)代理后的对象,增强了通知逻辑,替代目标对象注入容器

2. AOP 代理机制

  • Spring 通过 动态代理(JDK动态代理或CGLIB)生成代理对象。

  • 代理对象实现接口或继承目标类,拦截方法调用。

  • 调用代理对象方法时,通知链被执行,Advice 在方法前后插入增强逻辑。


3. Advisor 及 Advice 相关

3.1 Advice 类型

  • Before Advice:方法调用前执行。

  • After Returning Advice:方法正常返回后执行。

  • After Throwing Advice:方法抛异常后执行。

  • After (finally) Advice:方法执行结束后执行(无论正常或异常)。

  • Around Advice:包围通知,可在方法调用前后自定义逻辑,有权决定是否执行目标方法。

3.2 Pointcut

  • 定义哪些方法是切入点。

  • 使用表达式语言(如 AspectJ 表达式)匹配类和方法。

3.3 Advisor

  • 是 Advice 和 Pointcut 的组合体。

  • Spring AOP 用 Advisor 统一管理切面中的通知逻辑和切点信息。

  • 一个切面可以包含多个 Advisor。


4. AOP 接入机制(BeanPostProcessor)

  • AnnotationAwareAspectJAutoProxyCreator 实现了 BeanPostProcessor

  • postProcessAfterInitialization()

    • 判断 Bean 是否匹配 Advisor 中的 Pointcut。

    • 匹配则为 Bean 创建代理对象(JDK 或 CGLIB)。

  • 容器中注入的代理对象包含通知逻辑。


5. 动态代理实现(详细)

方式实现原理适用场景优缺点
JDK 动态代理实现目标接口,通过 InvocationHandler 代理方法调用目标类实现接口,接口明确简单高效,接口限制,不能代理新增方法
CGLIB 代理继承目标类,重写方法,通过 MethodInterceptor 代理目标类无接口或需要代理所有方法支持无接口类,不能代理 final 方法,生成开销较大
  • Spring 默认优先使用 JDK 动态代理,目标类无接口时用 CGLIB。


6. AOP 执行流程总结

1. Spring容器创建Bean
2. BeanPostProcessor.postProcessAfterInitialization判断是否需要代理
3. 查找所有Advisor,匹配Pointcut
4. 若匹配,生成代理对象(JDK或CGLIB)
5. 代理对象替代原始Bean注入容器
6. 调用代理对象方法
7. 代理对象执行Advisor中Advice链
8. Advice执行前后增强逻辑(Before, Around, After等)
9. 最终调用目标对象方法
10. 返回结果

7. 相关要点

  • Advisor是Spring AOP的关键封装,统一管理通知和切点。

  • Advice具体执行增强逻辑,Pointcut定义增强范围。

  • 代理对象透明替代目标对象,业务代码无感知。

  • 三级缓存机制支持循环依赖与早期代理引用。

  • 注意:CGLIB不能代理final方法,JDK代理只能代理接口方法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值