1.什么是 AOP?
AOP是通过将应用逻辑与系统服务分离,提高代码的可维护性和复用性。例如,在开发中,如果需要在多个方法中添加与业务无关的公共逻辑,使用AOP可以避免在每个方法中重复修改,而是统一地通过切面处理这些逻辑,如日志记录或权限验证。这样,核心业务代码保持简洁清晰,系统服务逻辑独立管理。
2.AOP的核心概念
(1)切面(Aspect):切面是AOP的核心,它把一些与业务逻辑无关的功能(如日志、事务、权限检查等)提取到单独的地方来管理,避免直接嵌入到业务逻辑中。
(2)连接点(Join Point):在Spring AOP中,连接点通常是方法执行的位置。
(3)通知(Advice):通知是切面在特定连接点执行的代码。通知定义了在连接点发生时应采取的操作,Spring AOP支持以下几种通知:
- 前置通知(Before):在目标方法执行前执行。
- 后置通知(After):在目标方法执行后执行。
- 返回通知(After Returning):目标方法正常返回后执行。
- 异常通知(After Throwing):目标方法抛出异常后执行。
- 环绕通知(Around):可以在目标方法执行前后控制执行流程,是最强大的一种通知类型。
(4)切入点(Pointcut):切入点定义了通知应该应用到哪些连接点。它通常是通过表达式来指定哪些方法符合通知的条件。切入点可以根据方法的名称、参数类型、返回值等特征来定义。
(5)目标对象(Target Object):目标对象是被代理的对象,通知会应用于这个对象的方法。在Spring中,目标对象通常是我们定义的业务逻辑类。
(6)代理(Proxy):代表了一个增强过的目标对象。通过代理,Spring AOP将切面逻辑应用到目标对象的方法上。Spring AOP提供了两种代理方式:JDK动态代理和CGLIB代理。
(7)织入(Weaving):织入是将切面应用到目标对象的过程,通常是在程序运行时进行。在Spring AOP中,织入发生在运行时,由Spring容器完成。
3.关注点和横切关注点的区别是什么?
关注点指的是应用程序中需要处理的各个功能模块或任务。每个关注点都代表了一个特定的业务功能。例如,在一个电商应用中,订单管理、支付处理和库存管理等都是业务功能的关注点,这些是系统的核心功能或业务逻辑。
横切关注点指的是那些跨越多个业务功能的通用问题或服务,这些问题在不同模块中重复出现,不直接属于核心业务逻辑。例如,日志记录、事务管理、安全验证、性能监控等,都是横切关注点。它们与业务逻辑无关,但需要在多个地方进行处理。
4.AOP的实现方式
(一)代理模式
(1)JDK 动态代理
基于 Java 的反射机制,在运行时动态地创建一个实现指定接口的代理对象。Spring AOP 在使用 JDK 动态代理时,只能对接口进行代理,因此目标对象必须实现至少一个接口。
优点:
简单高效,基于接口,符合面向接口编程的设计理念
不许要目标对象的类进行修改
缺点:
只能对实现了接口的类进行代理,如果目标类没有实现接口,就不能使用 JDK 动态代理
(2)CGLIB 代理
CGLIB 是一个强大的字节码生成库,它通过继承目标类的方式来生成代理类。CGLIB 代理通过生成目标类的子类来增强目标对象,因此可以对没有实现接口的类进行代理。
优点:
可以代理没有实现接口的类
无需接口,直接通过类的继承来实现代理
缺点:
每次代理对象都会创建目标类的子类,可能会影响性能。
不能对final类或final方法进行代理,因为CGLIB需要通过子类继承的方式生成代理类,而final方法无法被重写。
(二)静态织入
(1)AspectJ 编译时织入
在编译期间,AspectJ 编译器会扫描代码,并将切面逻辑织入到目标类的字节码中
(三)加载时织入
加载时织入发生在类加载的过程中,当类被夹在到 JVM 时,通过 ClassLoader 动态地将切面逻辑织入到目标类的字节码中。适用于在运行时动态加载的类
5.Spring AOP 和 AspectJ AOP 有什么区别?
AspectJ AOP 使用静态代理,AOP 框架在编译阶段生成 AOP 代理类,也称作编译时增强。在编译阶段将切面直接织入 Java 字节码中,生成增强后的 AOP 代理类,因此它在运行时不需要额外的代理创建,性能开销较小,适合复杂的切面需求
Spring AOP 使用动态代理,通过 JDK 动态代理或 CGLIB 代理在运行时生成代理对象,又称作运行时增强,它的性能开销相对较大,尤其在频繁调用的情况下,因此更适合用来处理简单的切面操作
这是我整理的笔记,目前还在学习阶段,文章中可能有错误和不足,欢迎大家斧正!