前面两篇文章 Spring AOP 详解 和 Spring AOP(二)介绍了 Spring AOP
的原理和代理对象的执行过程,相信小伙伴都有一定收获,那么这篇文章就是来总结回顾一下 AOP
的重点知识和相关面试题。
1. AOP 概述
AOP
面向切面编程,英文全称是 Aspect Oriented Programming
,它是 OOP
的补充。OOP
关注的核心是对象,AOP
的核心是切面(Aspect
)。AOP
可以在不修改功能代码本身的前提下,使用运行时动态代理的技术对已有代码逻辑增强。AOP
可以实现组件化、可插拔式的功能扩展,通过简单配置即可将功能增强到指定的切入点。
2. AOP 原理
AOP的底层设计是由运行时动态代理支撑,在 bean 的初始化流程中,借助 BeanPostProcessor 将原始的目标对象织入通知,生成代理对象。
AOP
在底层,借助 AnnotationAwareAspectJAutoProxyCreator
在 bean
的初始化流程,postProcessAfterInitialization
方法中将目标对象包装为代理对象。这里面涉及到几个核心步骤:
检查当前初始化的
bean
是否可以被AOP
代理(检查是否有匹配的增强器);如果存在,则根据当前初始化的
bean
所属类有无实现接口,以及AOP
的全局配置,决定使用哪种代理方案;将目标对象包装为
TargetSource
,并以此为原型生成代理对象。
3. jdk动态代理和Cglib动态代理的对比
jdk
动态代理要求被代理的对象所属类至少实现一个接口,它是jdk
内置的机制。Cglib
动态代理无此限制,使用字节码增强技术实现,需要依赖第三方Cglib
包jdk
动态代理的代理对象创建速度快,执行速度慢;Cglib
动态代理的代理对象创建速度慢,执行速度快
4. AOP 术语
Target
目标对象:被代理的原始对象。Proxy
代理对象:目标对象被织入通知后的产物就是代理对象。JoinPoint
连接点:目标对象的所属类中,定义的所有方法均为连接点。Pointcut
切入点:被切面拦截 / 增强的连接点(切入点一定是连接点,连接点不一定是切入点)。Advice
通知:增强的逻辑 / 代码,也即拦截到目标对象的连接点之后要做的事情。Aspect
切面:切入点 + 通知。
评论区