最新Spring常见面试题和答案合集:面试必备

2021年11月28日23:54:50 发表评论 978 次浏览
最新Spring常见面试题和答案合集:面试必备

自 2002 年 10 月发布以来,Spring Framework 已成功成为 Java 开发人员的顶级应用程序框架。事实上,它在领先的后端 Web 开发框架中占有一席之地。因此,选择 Spring Framework 的职业是非常有利可图的。

热门的Spring常见面试题和答案合集

Spring Framework 具有广泛的概念,需要对这些概念有深入的了解才能在游戏中保持领先地位。如果你正在准备Spring工作面试,那么以下是你必须知道的Spring面试热门问题的答案:

问题:请列出 Spring Framework 的各种特性以及使用它们的优点。

Spring面试题解析如下:

Spring框架的特点:

  • 允许创建和管理应用程序对象的配置和生命周期
  • AOP(Aspect Oriented Programming)通过将应用业务逻辑与系统服务分离,为统一开发提供支持
  • 高度可配置的 MVC Web 应用程序框架,能够轻松切换到其他框架
  • 对象不是寻找或创建依赖对象,而是提供它们的依赖关系。这种设计原理被称为 IoC(控制反转)
  • 轻的
  • 为事务管理提供通用抽象层,也可用于无容器环境
  • JDBC 抽象层提供了简化错误处理的异常层次结构

好处:

  • 启用POJO(Plain Old Java Object)编程,进一步实现持续集成和可测试性
  • 没有供应商锁定的开源
  • 由于 DI(依赖注入)和控制反转而简化的 JDBC
  • 由于采用分层架构,因此可以轻松保留所需内容并丢弃不需要的内容

Spring常见面试题有哪些: Spring Framework 有多少个模块?

答: Spring Framework 大约有 20 个模块。它们中的每一个都分为以下层之一:

  • Spring Core Container – Spring 框架的基本核心层。它有以下模块:
  • SpEL(Spring 表达式语言)
  • Spring Bean
  • Spring Core
  • Spring Context
  • 数据访问/集成——这是负责为与数据库交互提供支持的层。它包含以下模块:
  • JDBC(Java 数据库连接)
  • JMS(Java 消息服务)
  • ORM(对象关系映射)
  • OXM(对象 XML 映射器)
  • 交易
  • Web – 为创建 Web 应用程序提供支持是这一层的职责。它有这些模块:
  • Web
  • Web – MVC
  • Web – Portlet
  • Web – Socket
  • 面向方面的编程——允许使用建议、切入点等来解耦代码
  • 检测 – 提供对类检测和类加载器实现的支持
  • 测试 – 负责为使用 JUnit 和 TestNG 完成测试提供支持

一些额外的 Spring Framework 模块是:

  • Aspects – 提供与 AspectJ 集成的支持
  • 消息传递 - 提供对 STOMP 和用于处理和路由来自 WebSocket 客户端的 STOMP 消息的注释编程模型的支持
最新Spring常见面试题和答案合集:面试必备

问题:  Spring 应用程序有哪些组件?

Spring面试题解析:典型的 Spring 应用程序可以细分为以下组件:

  • Bean 类——包含属性、函数、setter 和 getter 方法等
  • Bean 配置文件 - 包含有关类的信息以及如何对其进行配置
  • 接口 – 定义功能
  • Spring Aspect Oriented Programming – 提供横切关注点的功能
  • 用户程序——使用函数

问题: 你对Spring IoC Container的理解是什么?解释它们的类型。

答: Spring IoC 容器是 Spring 框架的核心。容器使用依赖注入来管理各种 Spring 应用程序组件。

IoC 容器负责创建对象、配置它们、将它们连接在一起并管理它们的生命周期。容器从提供的配置元数据中接收有关相同的指令。

提供配置元数据的方法可以包括 Java 注释、Java 代码或 XML。Spring中有两种类型的IoC容器:

  • ApplicationContext – 提供附加功能。它建立在 BeanFactory 接口之上。
  • BeanFactory – 一个包含 bean 集合的预打包类。根据客户的要求实例化 bean

Spring常见面试题和答案合集:请解释一下Spring中的依赖注入。有多少种方法可以使用相同的方法?

回答:依赖注入允许定义应该如何创建对象,而不是直接创建对象。因此,代码不直接包含将组件和服务连接在一起。

配置文件包含有关哪些组件需要哪些服务的信息。IoC 容器负责将组件与适当的服务连接起来。依赖注入可以以下列形式使用:

  1. 构造器注入
  2. setter注入

问题: 你能区分 Spring 中的 ApplicationContext 和 BeanFactory 吗?

回答:

  • 基于注解的依赖——BeanFactory 不支持基于注解的依赖,而 ApplicationContext 支持
  • 接口定义——BeanFactory 接口定义在 org.springframework.beans.factory.BeanFactory 中,而 ApplicationContext 接口定义在 org.springframework.context.ApplicationContext 中
  • 国际化支持——虽然 ApplicationContext 支持国际化,但 BeanFactory 不支持
  • 对象管理——BeanFactory 使用语法来提供资源对象。相反,ApplicationContext 自己创建和管理资源对象
  • 初始化类型——ApplicationContext 使用急切或积极的初始化。另一方面,BeanFactory 使用延迟初始化

问题: 配置元数据是如何提供给Spring容器的?

答:配置元数据提供给Spring容器的方式有3种,列举如下:

  • 基于注解的配置——默认情况下,Spring 容器中的注解连接是关闭的。在适用的类、字段或方法声明上使用注解允许它替代使用 XML 来描述 bean 连接。
  • 基于 Java 的配置——这是 Spring Framework 中最新形式的配置元数据。它有两个重要的组成部分:
    1. @Bean 注解——与 <bean/> 元素相同
    2. @Configuration 注解——允许通过简单地调用同一 @Configuration 类中的其他 @Bean 方法来定义 bean 间的依赖关系
  • 基于 XML 的配置 - 依赖项以及 bean 所需的服务在遵循 XML 格式的配置文件中指定。通常,这些配置文件包含几个特定于应用程序的配置选项和 bean 定义。

问题:你对 Spring Beans 的理解是什么?Spring Framework 支持多少个 bean 范围?

答:由 Spring IoC 容器配置、实例化、管理和连接的 Spring Bean 是构成 Spring 应用程序核心的对象。Spring Bean 是使用提供给 Spring IoC 容器的配置元数据创建的。

Spring Framework 总共提供了 5 个范围的支持:

  • 全局会话* – 为全局 HTTP 会话提供 bean 定义的范围
  • 原型——为具有任意数量对象实例的单个 bean 定义提供范围
  • Request* – 为 HTTP 请求提供 bean 定义的范围
  • Session* – 为每个 Spring IoC 容器的单个实例提供 bean 定义的范围
  • Singleton – 为每个 Spring IoC 容器的单个实例提供 bean 定义的范围 * ? 仅在使用 Web 感知 ApplicationContext 时可用。

问题:请解释一下 Spring Bean Factory Container 中的 Bean 生命周期?

回答:

  1. bean 生命周期从 Spring IoC 容器从 XML 文件中的 bean 定义实例化 bean 开始
  2. 正如 bean 定义中指定的那样,Spring 然后使用 DI 填充所有属性
  3. 如果 bean 实现了 BeanNameAware 接口,则通过传递 bean ID 调用 setBeanName() 方法
  4. 如果 bean 实现了 BeanFactoryAware 接口,则通过传递 bean 的实例来调用 setBeanFactory() 方法
  5. 如果有任何 BeanPostProcessors 与 bean 相关联,则调用 preProcessBeforeInitialization() 方法
  6. 如果为 bean 指定了init 方法,则调用该方法
  7. 最后,如果有任何 BeanPostProcessor 与 bean 相关联,则调用 postProcessAfterInitialization() 方法。

问题:什么是 Spring 配置文件?

答:由于 Spring 基于依赖注入的概念,所有的类、接口及其依赖项都存储在一个称为 spring 配置文件的文件中。它是一个 .xml 文件。spring容器使用这个文件来控制spring bean的生命周期。一个 bean 被配置为:

<bean id = "..." class = "..." init-method = "..." lazy-init="true" destroy-method="....">
      <!-- bean dependencies and configurations -->
</bean>

Spring常见面试题有哪些:IoC(控制反转)有什么好处?

答:优点是:

  • 无需编写关于如何创建服务和获取对象引用的大量代码。一切都可以通过简单的配置来实现。只需添加构造函数或 setter 方法即可添加新的依赖项和服务。
  • 代码更易于单元测试,因为它被设计为多个组件,开发人员可以注入他们的对象并切换实现。
  • 组件的松散耦合。
  • 允许延迟加载对象和依赖项。

问:Spring Bean Factory Container中的Bean生命周期是什么?

答: bean的生命周期如下:

  • bean 由 Spring 容器根据 spring 配置文件中的 bean 定义实例化。
  • 使用依赖注入,bean 定义中指定的所有属性都被填充。
  • 如果 bean 实现了 BeanNameAware 接口,则 bean 工厂绕过 bean 的 ID 调用 setBeanName()。
  • 如果 bean 实现了 BeanNameAware 接口,则通过传递 bean 的实例调用 setBeanFactory()。 
  • 如果有任何 BeanPreProcessor 与 bean 相关联,则调用 preProcessBeforeInitialization() 方法。
  • 初始化方法,如果为 bean 定义,将被调用。
  • 最后,如果需要,将调用 postProcessAfterInitialization() 方法。

问题:解释一下 Spring 中的内豆。

答:内层 bean 是存在于另一个 bean 范围内的 bean。这个概念类似于 Java 中的内部类。内部 bean 被定义为外部 bean id 标签内的目标。

<bean id = "outerBean" class = "...">
      <property name = "target">
         <bean id = "innerBean" class = "..."/>
      </property>
</bean>

问题: 什么是基于注解的容器配置?另外,解释一下如何在 Spring Framework 中开启注解连接。

答:基于注释的容器配置是 XML 设置的替代方案。开发人员不是使用 XML 来描述 bean 连接,而是通过在适当的类、字段或方法声明上使用注释将配置移动到组件类。

因为注解连线默认是关闭的,所以需要先开启才可以使用。它是通过在 Spring 配置文件中配置 <context:annotation-config/> 元素来完成的。

问: 请解释一下Spring支持的各种注解。

回答:

  • @Autowired – 用于在 setter 方法、属性、构造函数或具有任意名称或多个参数的方法上自动装配 bean。它可以精确控制自动装配的方式和位置。
  • @Component – Spring 管理组件的通用构造型,它将 Java 类标记为可被组件扫描机制拾取并将其拉入应用程序上下文的 bean。
  • @Controller – 将类标记为 Spring Web MVC 控制器。标有此注解的 Bean 会自动导入到依赖注入容器中。
  • @Qualifier – 与 @Autowired 注释一起使用,用于指定仅需要连接几个但相似的 bean 之一。
  • @Repository – 组件注解的特化,具有几乎相同的用途和功能。具体来说,它为DAO(数据访问对象)提供了额外的好处。
  • @RequestMapping – 将特定的 HTTP 请求方法映射到控制器中负责处理相应请求的特定类或方法。
  • @Required – 应用于 bean 属性 setter 方法,它表示需要在配置时使用 bean 定义中存在的显式属性值或通过自动装配来填充 bean 属性。如果未填充 bean 属性,容器将抛出 BeanInitializationException 消息。
  • @Service – 组件注解的另一种特殊化。尽管它不提供任何超过组件注释的额外行为,但它可以用于服务层类中的 @component 注释,以便以更好的方式指定意图。

问: Spring DAO 支持是什么意思?

答: Spring DAO 支持以可靠的方式简化了数据访问技术的使用,例如 JDBC、JDO 和 Hibernate。此外,它允许编码而无需担心捕获特定技术异常,并且可以轻松地在持久性技术之间进行切换。

问题:  JDBC API 包含哪些类?

回答:

  • 数据库模板
  • 命名参数Jdbc模板
  • 简单的JdbcCall
  • 简单的Jdbc插入
  • 简单的Jdbc模板

问题: 你将如何使用 Spring Framework 访问 Hibernate?

答: 可以通过以下两种方式使用 Spring Framework 访问Hibernate:

  1. 扩展 HibernateDAOSupport,然后应用 AOP 拦截器节点
  2. 使用 Hibernate 模板和回调进行控制反转

Spring常见面试题和答案合集: 列举Spring支持的事务管理类型。

答: Spring Framework 支持两种类型的事务管理:

  • 声明式事务管理——虽然事务管理与业务代码分离,但仅使用注释或基于 XML 的配置来管理事务。
  • 程序化事务管理——事务通过编程进行管理。尽管极其灵活,但维护起来却非常困难。

问:请解释AOP技术。

答: AOP 或面向方面的编程是一种编程技术,它允许程序员将跨越典型职责分工或横切关注点的行为模块化。日志记录和事务管理是横切关注点的例子。

问题:  Spring 的建议是什么?解释它的各种类型。

答:方面在 Spring 框架中的某个特定连接点采取的任何操作都称为 Advice。Spring AOP 使用通知来维护“围绕”连接点的拦截器链,即作为拦截器。建议可以是以下类型:

  1. After (finally) – 使用@After注解标记配置,在joinpoint方法之后执行,无论是正常退出还是抛出异常
  2. 返回后——使用@AfterReturning注解标记配置,在joinpoint方法完成正常执行后立即执行
  3. 抛出后 - 使用@AfterThrowing 注释标记配置,当且仅当关节点方法通过抛出异常退出时才执行
  4. Around - 使用@Around 注释标记配置,它在连接点方法之前和之后执行
  5. Before – 使用@Before 注解标记配置,在joinpoint 方法之前执行

问题:你能比较一下 Spring AOP 中的关注点和横切关注点吗?

Spring面试题解析:虽然关注点是开发人员希望在 Spring 应用程序的特定模块中具有的行为,但横切关注点是适用于整个 Spring 应用程序的关注点。

问题: 你对Spring MVC框架的理解是什么?

答: Spring MVC 框架负责提供模型-视图-控制器架构以及即用型组件,用于开发灵活松散耦合的 Web 应用程序。

除了在这些分离的元素之间提供松散耦合之外,MVC 模式还有助于分离应用程序的各个方面,例如业务逻辑、输入逻辑和 UI 逻辑。

问题:请解释 DispatcherServlet。

答: DispatcherServlet 是 Spring Web MVC 框架的精髓,处理所有 HTTP 请求和响应。DispatcherServlet从配置文件中接收到handler mapping的入口后,将请求转发给控制器。

此后,控制器返回一个模型和视图对象。之后,Dispatcher Servlet 检查配置文件中是否有视图解析器的入口,并调用指定的视图组件。

问:什么是Spring?

答: Spring 是一个集成框架,用于用 Java 语言开发企业应用程序。

问题:Bean Factory 和 Application Context 之间有什么区别吗?

答:是的,Bean Factory 和 Application Context 之间有很多区别。这些说明如下:

Bean FactoryApplication Context
这是一个基本的容器它是一个高级容器
它有一个有限的接口。它扩展了 Bean Factory 接口
它提供各种基础设施。它提供了比 Bean Factory 额外的功能,包括与 Spring AOP 的集成、i18n 的消息资源处理等。

Spring常见面试题有哪些:Constructor Injection 和 Setter Injection 有什么区别?

答: Constructor Injection 和 Setter Injection 的区别如下:

构造函数注入Setter注射
它有一个完整的注射它有一个部分注入
它不会覆盖 setter 属性当它们都被定义时,它会覆盖构造函数属性。
当需要修改时,它会创建新的实例。当属性值更改时,它不会创建新的实例。
它比 Setter Injection 有更多的属性这对一些属性有好处。

问题:在 Spring 中定义 Autowriting 吗?

答: Spring 中的自动装配帮助计算机程序员自动应用 bean,而无需编写显式注入逻辑。各种自动写入模式包括以下内容。

  1. NO。
  2. 按名字。
  3. 按类型。
  4. 构造函数。

问题:Spring 框架中有哪些不同类型的 Bean 作用域?

答: Spring框架中的Bean作用域主要有五种。这些包括以下内容。

  1. 单例。
  2. 原型。
  3. request。
  4. session。
  5. 全局session。

问题:Spring 中的切入点是什么?

答: Pointcut 是 Spring AOP 的一种表达语言。

Spring 框架有哪些不同的最新版本?

Spring框架的最新版本如下。

  1. Spring 2.5
  2. Spring 3.0
  3. Spring 4.0

问题:JoinPoint 是什么?

答: JoinPoint 是程序执行过程中的一个点,代表方法的执行。它包括方法的执行甚至异常的处理。

问:Spring AOP 和 AspectJ AOP 有什么区别?

答: Spring AOP 和 AspectJ AOP 有几个区别,具体如下:

Spring AOPAspectJ AOP
代理是通过运行时编织完成的。编译时编织是通过 AspectJ Java 工具完成的
应用了方法级别的切入点应用了字段级切入点
它基于 DTD它基于schema和注解配置

问题:Spring Framework 中的代理是什么?

答: Spring 框架中的代理被称为在对特定目标对象应用通知后创建对象。 

问题:什么时候目标对象和代理对象是一样的?

答:在客户端对象的情况下,目标对象和代理对象是相同的。

问题:Spring框架中的weaving是什么?

答: Spring 框架中的编织是将特定方面与其他应用程序类型或对象链接的过程,以便创建建议对象。它主要在运行时执行。

问题:什么是 Spring Security?

答: Spring Security 是 Spring 框架中的一个独立模块,专注于提供可在 Java 应用程序中使用的身份验证和授权方法。

问题:什么是Spring Boot?

答: Spring Boot 是一个项目的名称,它提供了一组预配置的框架,旨在减少样板配置。它有助于使用较少的代码启动和运行 spring 应用程序。

问题:什么是响应式编程?

答:反应式编程是一个非阻塞和事件驱动的应用程序。它使用少量线程进行扩展。背压是关键因素,它确定生产者不会压倒消费者。

问题:响应式编程有什么好处?

答:反应式编程有多种好处,其中包括以下几点。

  1. 它有助于提高计算资源的利用率,包括多核和多 CPU 硬件。
  2. 它有助于通过减少序列化过程来提高性能。

问题:Reactive 系统的重要特征是什么?

答: Reactive 系统的重要特性包括以下几点。

  1. 消息驱动。
  2. 有弹性的。
  3. 反应灵敏。
  4. 弹性。

问题:定义 Spring Webflux?

答: Spring Web Flux 是 Spring 的一个高度响应式的 Web 框架。它充当 Spring MVC 的替代方案,并提供高度可扩展且非阻塞的堆栈。

Spring常见面试题和答案合集:定义 Mono 和 Flux 类型?

答: Mono 和 Flux 类型,都是 Spring Framework 5 的反应器。 Mono 表示单个异步值,而 Flux 表示异步值流。它们一起帮助实现了在响应式流规范中明确定义的发布者接口。

问题:Spring 中 Mono 和 Flux 的基本区别是什么?

答: Mono 实现发布者并返回 0 甚至 1 个元素,而 Flux 实现发布者并返回 N 个元素。

问:Mono 和 Flux 的共同特点是什么?

答: Mono 和 Flux 的共同特点包括以下几点。

  1. 它们代表流。
  2. 如果不使用 subscribe 方法消耗流,则无法执行它们。
  3. 它们是不可变的,可以一次又一次地调用以创建 Flux 或 Mono 的新实例。

问:Web客户端和Webtestclient的区别?

Spring面试题解析: Web 客户端和 Webtest 客户端的区别如下。

网络客户端网络测试客户端
Web 客户端充当执行非阻塞 HTTP 请求的反应式客户端。 Webtestclient 还充当可用于测试的反应式客户端。
它可以处理带有背压的反应流。它可以通过应用模拟请求和响应对象直接绑定到 WebFlux 应用程序。
它可以利用 JAVA 8 Lambdas。它可以通过 HTTP 连接连接到任何服务器。

问题:你认为 Spring 5 兼容旧版本的 JAVA 吗?

答:不可以,Spring 5 与旧版本的 JAVA 不兼容。它至少需要 JAVA 8 才能获得兼容性。

Spring常见面试题有哪些:Spring Boot 可以在同一个应用程序中允许 Spring MVC 或 Spring WebFlux 吗?

答:是的,Spring Boot 可以在同一个应用程序中允许 Spring MVC 或 Spring WebFlux,但条件是一次只能应用一个。这是因为 MVC 是一种阻塞范式,而 WebFlux 是一种非阻塞范式,因此不能一起使用。

问:Spring MVC 可以运行在 Netty 上吗?

答:不可以,Spring MVC 不能在 Netty 上运行。 

问:Spring 5 能否与 Jdk9 模块化集成?

答:是的,Spring 5 可以与 Jdk9 模块化集成。这可以表述如下。

第 1 步:创建一个新类:

package com.hello;
public class HelloWorld {
    public String sayHello(){
        return "HelloWorld";
    }
}

第 2 步:创建一个新模块:

module com.hello {
    export com.hello;
}

第 3 步:创建一个新的 Java 项目:

module com.hello.client {
    requires com.hello;
}

第 4 步:测试新模块:

public class HelloWorldClient {
    public static void main(String[] args){
        HelloWorld helloWorld = new HelloWorld();
        log.info(helloWorld.sayHello());
    }
}

Spring常见面试题和答案合集结论

所以,这就完成了Spring面试中最重要的问题列表。这些问题肯定会帮助你为Spring面试做好准备。

寻找更多Spring面试问题?这是一个很棒的 udemy 课程:Spring面试问题准备课程。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: