Java必考面试题,谈谈你对 Spring AOP 的理解

大家好,我是伍六七。

今天我们来学习 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 人+的央企子公司,之后又进了互联网大厂。

一份让我进大厂&央企的面试题

相关推荐
Justin3go3 小时前
HUNT0 上线了——尽早发布,尽早发现
前端·后端·程序员
Tony Bai4 小时前
高并发后端:坚守 Go,还是拥抱 Rust?
开发语言·后端·golang·rust
没有bug.的程序员4 小时前
服务安全:内部服务如何防止“裸奔”?
java·网络安全·云原生安全·服务安全·零信任架构·微服务安全·内部鉴权
一线大码4 小时前
SpringBoot 3 和 4 的版本新特性和升级要点
java·spring boot·后端
weixin_440730504 小时前
java数组整理笔记
java·开发语言·笔记
weixin_425023005 小时前
Spring Boot 配置文件优先级详解
spring boot·后端·python
weixin_425023005 小时前
Spring Boot 实用核心技巧汇总:日期格式化、线程管控、MCP服务、AOP进阶等
java·spring boot·后端
一线大码5 小时前
Java 8-25 各个版本新特性总结
java·后端
2501_906150565 小时前
私有部署问卷系统操作实战记录-DWSurvey
java·运维·服务器·spring·开源
better_liang5 小时前
每日Java面试场景题知识点之-TCP/IP协议栈与Socket编程
java·tcp/ip·计算机网络·网络编程·socket·面试题