# Spring 热门 AOP 面试问题及答案

> 原文： [https://howtodoinjava.com/interview-questions/top-spring-aop-interview-questions-with-answers/](https://howtodoinjava.com/interview-questions/top-spring-aop-interview-questions-with-answers/)

在经历了 [**Spring 核心面试问题**](https://howtodoinjava.com/spring/spring-core/top-spring-core-interview-questions-with-answers/) 之后，让我们介绍一下 [**Spring AOP**](https://howtodoinjava.com/category/frameworks/java-spring-tutorials/spring-aop/) [面试问题](https://howtodoinjava.com/java-interview-questions/) 您的下一次技术面试。 同样，请随时提出一些新问题，这些新问题不在本文中，因此我可以将其包括在内，以使更多的读者受益。

```java
Table of Contents

Describe Spring AOP?
What is the difference between concern and cross-cutting concern in Spring AOP?
What are the available AOP implementations?
What are the different advice types in spring?
What is Spring AOP Proxy?
What is Introduction?
What is joint point and Point cut?
What is Weaving in AOP?
```

## 描述 Spring AOP？

[**Spring AOP（面向切面​​的编程）**](https://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html) 补充了 [**OOP**](https://howtodoinjava.com/category/object-oriented/) ，因为它也提供了模块化。 在 OOP 中，关键单元是对象，但是在 AOP 中，关键单元**是切面**或关注点（仅假设应用程序中具有独立模块）。 一些切面具有集中的代码，但是其他切面可能是分散的或缠结的，例如。 记录或事务。 这些分散的切面称为跨领域关注点。 横切关注点是可能影响整个应用程序的关注点，应尽可能集中在代码中的一个位置，例如事务管理，身份验证，日志记录，安全性等。

AOP 提供了一种使用简单的可插拔配置在实际逻辑之前，之后或周围动态添加横切关注点的方法。 现在和将来，维护代码也变得很容易。 您只需更改配置文件即可添加/删除关注点，而无需重新编译完整的源代码（如果您要使用要求 XML 配置的切面）。

可以通过以下两种主要方式使用 Spring AOP。 但是广泛使用的方法是 Spring AspectJ 注解样式。

**1）[通过 AspectJ 注解样式](https://howtodoinjava.com/spring/spring-aop/spring-aop-aspectj-example-tutorial-using-annotation-config/)
2）[通过 Spring XML 配置样式](https://howtodoinjava.com/spring/spring-aop/spring-aop-aspectj-xml-configuration-example/)**

## Spring AOP 中的关注和跨领域关注之间有什么区别？

**关注的是我们希望在应用程序的模块中具有的行为**。关注可以定义为我们要解决特定业务问题的功能。 例如。 在任何电子商务应用程序中，不同的关注点（或模块）可能是库存管理，运输管理，用户管理等。

**跨领域关注是适用于整个应用程序（或多个模块）的关注**。 例如日志记录，安全性和数据传输是应用程序几乎每个模块都需要考虑的问题，因此它们被称为跨领域关注点。

## 有哪些可用的 AOP 实现？

下面列出了基于 Java 的主要 AOP 实现：

1.  [AspectJ](https://eclipse.org/aspectj/)
2.  Spring AOP
3.  [JBoss AOP](http://jbossaop.jboss.org/)

您可以在 [**Wiki 页面**](https://en.wikipedia.org/wiki/Aspect-oriented_programming#Implementations) 中找到 AOP 实现的重要列表。

## Spring 有哪些不同的建议类型？

建议是您有兴趣在应用程序的其他模块上应用的跨领域关注点的实现。 建议主要有 5 种：

1.  **事前建议**：在连接点之前执行的建议，但是它不能阻止执行流程前进到连接点（除非它引发异常）。 要使用此建议，请使用`@Before`注解。
2.  **返回后建议**：在连接点正常完成后要执行的建议。 例如，如果某个方法返回而没有引发异常。 要使用此建议，请使用`@AfterReturning`注解。
3.  **抛出后建议**：如果方法因引发异常而退出，则要执行的建议。 要使用此建议，请使用`@AfterThrowing`注解。
4.  **事后建议**：无论连接点退出的方式如何（正常或特殊返回），均应执行的建议。 要使用此建议，请使用`@After`注解。
5.  **周围建议**：围绕连接点的建议，例如方法调用。 这是最有力的建议。 要使用此建议，请使用`@Around`注解。

## 什么是 Spring AOP 代理？

代理是一种常用的设计模式。 简而言之，代理是一个看起来像另一个对象的对象，但是在**幕后添加了特殊功能**。

Spring AOP 是基于代理的。 AOP 代理是由 AOP 框架创建的对象，用于在运行时实现切面协定。

Spring AOP 默认将标准 JDK 动态代理用于 AOP 代理。 这使得可以代理任何接口（或一组接口）。 Spring AOP 也可以使用 CGLIB 代理。 这是代理类而不是接口所必需的。

**如果业务对象未实现接口**，则默认使用 CGLIB。

## 什么是简介？

**简介使切面可以声明建议对象实现其在实际**中没有的任何其他接口，并代表那些对象提供该接口的实现。

使用`@DeclareParents`注解进行介绍。

阅读有关[**简介**](https://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-introductions)的更多信息。

## 什么是连接点和切点？

连接点是程序的执行点，例如方法的执行或异常的处理。 在 Spring AOP 中，**连接点始终表示方法执行**。 例如，如果您在`EmployeeManager`接口驾驶室内定义的所有方法都涉及到交叉问题，则这些方法都被视为连接点。

**切入点是与连接点匹配的谓词或表达式**。 通知与切入点表达式关联，并且在与切入点匹配的任何连接点运行（例如，表达式`execution(* EmployeeManager.getEmployeeById(..))`以匹配`EmployeeManager`接口中的方法`getEmployeeById()`）。 切入点表达式匹配的连接点的概念是 AOP 的核心，默认情况下，Spring 使用 AspectJ 切入点表达语言。

## 什么是织入？

**Spring AOP** 框架仅支持有限类型的 AspectJ 切入点，并允许将切面应用于 IoC 容器中声明的 bean。 如果您想使用其他切入点类型或将外观[应用于在 Spring IoC 容器外部创建的对象），则必须在 Spring 应用程序中使用 AspectJ 框架并使用其织入功能。

织入是将切面与其他外部应用程序类型或对象链接以创建建议对象的过程。 这可以在编译时（例如，使用 AspectJ 编译器），加载时或在运行时完成。 像其他纯 Java AOP 框架一样，Spring AOP 仅在运行时执行织入。 相反，AspectJ 框架同时支持编译时和加载时织入。

AspectJ 的编译时织入是通过称为`ajc`的特殊 AspectJ 编译器完成的。 它可以将切面织入到 Java 源文件中，并输出织入的二进制类文件。 它还可以将切面织入到已编译的类文件或 JAR 文件中。 此过程称为编译后织入。 您可以在 Spring IoC 容器中声明它们之前，对类进行编译时和编译后织入。 Spring 根本不参与织入过程。 有关编译时和编译后织入的更多信息，请参考 AspectJ 文档。

当类加载器将目标类加载到 JVM 时，就会发生 AspectJ 加载时织入（也称为 LTW）。 对于要织入的类，需要特殊的类加载器来增强目标类的字节码。 AspectJ 和 Spring 都提供了加载时织入器，以向类加载器添加加载时织入功能。 您只需要简单的配置即可启用这些加载时织布器。

现在该轮到您分享更多您在以前的面试中遇到的**Spring AOP 面试问题**，以便我可以将其包含在本帖子中，并使其对他人也更有用。

**祝您学习愉快！**