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

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

相关推荐
nameofworld9 分钟前
前端面试笔试(二)
前端·javascript·面试·学习方法·数组去重
摇光9341 分钟前
promise
前端·面试·promise
Ai 编码助手1 小时前
Go语言 实现将中文转化为拼音
开发语言·后端·golang
hummhumm1 小时前
第 12 章 - Go语言 方法
java·开发语言·javascript·后端·python·sql·golang
hummhumm1 小时前
第 8 章 - Go语言 数组与切片
java·开发语言·javascript·python·sql·golang·database
尼克_张1 小时前
tomcat配合geoserver安装及使用
java·tomcat
杜杜的man1 小时前
【go从零单排】Directories、Temporary Files and Directories目录和临时目录、临时文件
开发语言·后端·golang
wywcool1 小时前
JVM学习之路(5)垃圾回收
java·jvm·后端·学习
-seventy-1 小时前
Java Web 工程全貌
java
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ2 小时前
idea 删除本地分支后,弹窗 delete tracked brank
java·ide·intellij-idea