请解释 AOP 的概念,说明实现 AOP 的常见方式,并比较 Spring AOP 与 AspectJ AOP 的主要差异。
考察说明
考查对 AOP 概念、实现机制及 Spring 与 AspectJ 区别的理解。
回答思路
- 【回答框架 1】AOP(面向切面编程)是通过预编译和运行期动态代理实现程序功能统一维护的技术,核心概念包括切面、连接点、切入点、通知、引入、织入,其目标是把横切逻辑(如日志、事务)从业务代码中解耦。
- 【回答框架 2】AOP 的主要实现方式分为静态织入和动态代理两类:静态织入在编译期或类加载期将切面代码织入字节码;动态代理则在运行期生成代理对象,如 JDK 动态代理和 CGLIB 代理。
- 【回答框架 3】Spring AOP 基于动态代理实现,默认在运行时织入,支持方法级别的连接点,需要目标对象实现接口时可使用 JDK 动态代理,否则使用 CGLIB;Spring AOP 的配置和使用相对简单,可与 Spring IoC 无缝集成。
- 【回答框架 4】AspectJ AOP 通过编译期、类加载期或运行期织入,支持字段和方法级别的连接点,功能更强大,可处理静态交叉关注点;但配置和集成较复杂,一般作为独立框架使用。
- 【回答框架 5】两者的本质区别在于织入时机和功能范围:Spring AOP 使用动态代理,对方法调用进行拦截,无法拦截类的字段访问;AspectJ 通过直接修改字节码,能支持更细粒度的切面,因此适合对性能或精细控制有更高要求的场景。
- 【关键点 1】AOP 的核心是横切关注点的模块化,通过代理或字节码增强实现解耦。
- 【关键点 2】Spring AOP 采用运行期动态代理,AspectJ 采用编译期或类加载期织入。
- 【关键点 3】AspectJ 支持方法级和字段级连接点,Spring AOP 仅支持方法级别。
- 【关键点 4】Spring AOP 与 IoC 集成方便,AspectJ 功能更强但配置复杂。
- 【易错点 1】易混淆 Spring AOP 与 AspectJ:Spring AOP 不支持字段拦截,AspectJ 支持。
- 【易错点 2】不能认为 Spring AOP 默认使用 CGLIB:默认使用 JDK 动态代理,除非目标类没有接口。
- 【易错点 3】动态代理无法拦截 final 方法或类,AspectJ 织入则不受此限制。