大家好,我是伍六七。
今天我们来学习 Spring 框架中最重要的概念之一:AOP。
这是一个 Java 程序员必考的面试题,大家好好理解。我们开始正文。
AOP 的概念
Spring AOP 是 Java 程序员们面试经常被问到的一个问题,但 AOP(Aspect-Oriented Programming)其实是一种编程范式,用于在程序运行期间将横切关注点(Cross-cutting Concerns)与核心业务逻辑分离开来,并不只是在 Spring 中使用。
横切关注点是指那些在应用程序中多个模块中都存在的功能,如日志记录、事务管理、安全性等。AOP 通过将这些横切关注点抽象为切面(Aspect),并将其与核心业务逻辑进行解耦,从而提高代码的可维护性和可重用性。
AOP 的原理
AOP 的原理是通过动态代理或字节码增强技术,在运行时将切面织入到目标对象的方法中。
在 Spring 框架中,AOP 的实现主要依赖于动态代理。Spring AOP 提供了两种类型的代理:基于接口的代理(JDK 动态代理)和基于类的代理(CGLIB 代理)。
基于接口的代理要求目标对象实现接口,而基于类的代理则通过继承目标对象来创建代理对象。
Spring AOP 有 7 个概念,你必须知道
-
切面(Aspect):切面是一个横跨多个类的关注点的模块化。在企业级 Java 应用程序中,事务管理是一个典型的横切关注点。在 Spring AOP 中,切面可以使用普通类(基于模式的方法)或带有@Aspect 注解的普通类(基于@AspectJ 风格)来实现。
-
连接点(Join point):程序执行过程中的一个点,例如方法的执行或异常的处理。在 Spring AOP 中,连接点始终表示方法的执行。
-
通知(Advice):切面在特定连接点上采取的操作。不同类型的通知包括「around」、「before」和「after」通知。许多 AOP 框架,包括 Spring,将通知建模为拦截器,维护着围绕连接点的拦截器链。
-
切点(Pointcut):用于匹配连接点的谓词。通知与切点表达式相关联,并在与切点匹配的任何连接点上运行(例如,执行具有特定名称的方法)。连接点的概念与切点表达式的匹配在 AOP 中是核心的,Spring 默认使用 AspectJ 切点表达式语言。
-
目标对象(Target object):被一个或多个切面所通知的对象。也称为被通知对象。由于 Spring AOP 是使用运行时代理实现的,因此该对象将始终是一个代理对象。
-
AOP 代理(AOP proxy):AOP 框架创建的对象,用于实现切面的契约(例如,通知方法的执行等)。在 Spring 框架中,AOP 代理可以是 JDK 动态代理或 CGLIB 代理。
-
织入(Weaving):将切面与其他应用程序类型或对象链接起来,创建一个被通知的对象。这可以在编译时(例如使用 AspectJ 编译器)、加载时或运行时进行。Spring AOP 和其他纯 Java AOP 框架一样,会在运行时进行织入。
AOP 的 8 种使用场景
- 日志记录:通过 AOP 可以在方法执行前后记录日志,方便跟踪和调试应用程序。
- 事务管理:AOP 可以在方法执行前后进行事务的开启、提交或回滚,简化了事务管理的代码。
- 安全性控制:通过 AOP 可以在方法执行前进行权限验证,确保只有具有相应权限的用户才能访问敏感数据或执行敏感操作。
- 性能监控:AOP 可以在方法执行前后进行性能监控,如记录方法的执行时间、调用次数等,用于性能优化和瓶颈分析。
- 异常处理:AOP 可以在方法执行过程中捕获异常,并进行统一的异常处理和错误日志记录。
- 缓存管理:AOP 可以在方法执行前后进行缓存的读取和更新,提高系统的响应速度和性能。
- 验证和校验:AOP 可以在方法执行前进行参数的验证和校验,确保输入的数据符合要求。
- 消息通知:AOP 可以在方法执行前后发送消息通知,如发送邮件、短信等。
一句话总结
AOP 通过将横切关注点与核心业务逻辑分离,提高了代码的可维护性和可重用性。
关注我,送你全套我整理的 Java 岗位面试资料。这是我自己之前整理的面试题,靠着这份面试题,我从 30 人的小公司,进了 2000 人+的央企子公司,之后又进了互联网大厂。