70个Spring面试问题和答案

85 阅读21分钟

Spring是一个基于Java的框架。它是由Rod Johnson开发的。Spring框架的第一个版本是由Rod Johnson与他的《专家一对一J2EE设计与开发》一书于2002年10月发布的。该框架于2003年6月在Apache 2.0许可下首次发布。在这篇文章中,我们介绍了70个Spring面试问题和答案。

1.什么是Spring?

Spring是一个基于Java的框架,用于开发基于Java的现代企业应用程序。Spring框架可用于开发任何类型的java应用,包括独立的和web应用。它为使用spring boot开发微服务提供支持。Spring框架提供的模块使数据驱动和基于Web的应用程序的开发更加容易。它遵循基于POJO的编程模型。

2.2.Spring框架的特点是什么?

Spring框架在市场上存在已久,并且非常有名,因为它为java开发者提供了功能和开发的便利性。以下是Spring框架的一些特点。

  • 轻量级:从尺寸和透明度来看,Spring是一个轻量级框架。Spring框架的基本版本的大小只有2MB左右。
  • 反转控制(Inversion of Control):Spring框架在依赖性注入的帮助下提供了IOC。反转控制有助于建立一个可扩展的松散耦合的软件应用程序。
  • 面向方面的编程:Spring支持面向方面的编程,这有助于分离应用程序的业务逻辑和跨领域的问题。
  • 事务管理:事务管理是面向RDBMS的企业应用程序的一个重要部分,以确保数据的完整性和一致性。Spring支持强大的事务管理。Spring提供的事务管理接口可以向下扩展到本地事务,向上扩展到全球事务。Spring提供了两种类型的事务管理--编程式和声明式。
  • 异常处理:Spring提供了一个方便的API,可以将特定技术的异常(由JDBC、Hibernate或JDO抛出)转化为一致的、未检查的异常。

3.什么是Spring Bean?

在Spring框架中,Bean是一个由Spring IoC容器实例化、组装和管理的对象。构成你的应用程序的骨干并由Spring IoC容器管理的对象被称为Bean。SpringApplicationContext 是用来获取Spring Bean实例的,Spring IoC容器管理Spring Bean的生命周期。

4.解释一下Spring Bean的生命周期。

作为任何事物的生命周期,Spring Bean的生命周期包括实例化、使用和销毁。在使用Bean之前,我们必须确保它已经被实例化,一旦系统中不再需要这个Bean,就应该将它从系统中删除以释放内存。
我们可以通过以下步骤了解Bean的生命周期:

  • Bean的生命周期始于Spring IoC容器根据XML文件中的Bean定义对Bean进行实例化。
  • Spring按照Bean定义(DI)中的规定填充所有的属性。
  • 如果Bean实现了BeanNameAware 接口,Spring将Bean的id传递给setBeanName() 方法。
  • 如果Bean实现了BeanFactoryAware 接口,spring将beanfactory 传递给setBeanFactory() 方法。
  • 如果有任何与Bean相关的BeanBeanPostProcessors ,Spring会调用postProcesserBeforeInitialization() 方法。
  • 如果Bean实现了IntializingBean ,它的afterPropertySet() 方法会被调用。如果Bean有init方法声明,则会调用指定的初始化方法。
  • 如果有任何与Bean相关的BeanPostProcessors,它们的**postProcessAfterInitialization()**方法将被调用。
  • 如果Bean实现了DisposableBean ,它将调用destroy() 方法。

5.在Spring框架中,Singleton Bean是线程安全的吗?

不,Singleton Bean在Spring框架中不是线程安全的。

6.在Spring中,有哪些不同的选项来注入Java集合?

Spring框架提供以下类型的Java集合配置元素。

  • <list> 类型用于注入一个允许重复的值列表。
  • <set> 类型用于注入一个值的集合,但集合中不允许有重复。
  • <map> 类型用于注入一个键值对的集合,其中键和值可以是任何类型。
  • <props> 类型用于注入键值对的集合,其中键和值都是字符串类型。

7.你能在Spring中注入null和空字符串值吗?

是的,你可以。

8.什么是Spring中的IOC和依赖注入?

IoC是控制反转(Inversion of Control)的缩写。它只是意味着将创建对象的责任委托给容器或框架。现在,程序员不需要使用new 关键字来创建一个类的对象。有很多方法可以实现IoC。
简而言之,依赖注入是一种我们可以用来实现控制反转的模式
,它包括:策略设计模式、服务定位模式、工厂模式和依赖注入。

9.9.Spring中不同的bean作用域是什么?

以下是最新版本的Spring框架所定义的范围类型。

  • 单元(Singleton
  • 原型
  • 请求
  • 会话
  • 应用程序
  • Websocket

后面提到的四个作用域只在Web-aware应用程序中可用。

10. 配置Spring应用程序的不同方法是什么?

以下是定义Spring应用程序配置的三种方式

  • 基于XML的配置
  • 基于Java的配置
  • 基于注解的配置

11.解释Spring中依赖性注入的各种方式。

在Spring中有三种依赖注入的方式。

  1. 基于构造器的依赖性注入
  2. 基于设置器的依赖注入
  3. 基于字段或属性的依赖性注入

12.构造函数注入和设定器注入的区别是什么?

构造函数注入

  • 它使用构造器来注入依赖关系
  • 字段是通过索引访问的
  • 它正确地初始化了一个类
  • 它有可测试性的好处

设置器注入

  • 它使用setter方法来注入依赖关系。
  • 它在XML配置文件中更容易阅读
  • 当使用setter注入时,不能保证完全的依赖性注入
  • 与构造器注入相比,它的安全性较低

13.解释一下Singleton和Prototype作用域的使用情况?

当在spring容器中只有一个bean定义的实例被实例化时,就会使用Singleton。
原型作用域允许人们为每个被传递的请求创建新的实例

不需要等待容器的清除。根据你的要求,你会选择其中之一。注入可以在Bean配置文件中提到。

14.在Spring中,有几种类型的IOC容器可用?

在Spring中有两种类型的IoC容器。

  1. BeanFactory
  2. ApplicationContext

15.15.描述一下重要的Spring模块。

以下是一些重要的Spring模块。

  • Spring AOP
  • Spring MVC
  • Spring Data JPA
  • Spring Data JDBC

16 解释一下@Autowired 注释。

@Autowired 注解用于定义Spring中的自动依赖注入。Spring容器有能力自动连接合作Bean之间的关系。这被称为spring bean autowiring。

17. 春天豆自动连接的不同类型是什么?

以下是spring中自动连接的不同模式。

  • No - 完全没有自动连接。这是默认模式。
  • byName - 该选项启用基于Bean名称的依赖性注入。
  • byType - 这个选项启用基于Bean类型的依赖注入。
  • constructor - 的自动布线与 相似,但适用于构造函数参数。constructor byType

18.事务管理的不同类型是什么?

在Spring框架中,有两种类型的事务管理支持。

  • 编程式事务管理
  • 声明式事务管理

19.使用IoC有什么好处?

IoC的主要好处包括 -

  • 最小化任何应用程序中的代码数量
  • 使得平台/应用易于测试,因为它不需要单子或JNDI查询机制
  • 以更少的努力和侵入性的机制促进松散耦合
  • 促进了急切的实例化

20.反应式编程的优势是什么?

以下是反应式编程的一些优点。

  • 有助于提高计算资源的利用率,如多核和多CPU硬件。
  • 复杂的线程变得非常容易
  • 有助于通过减少序列化过程来提高性能。
  • 容易实现反压

21.使用Spring框架的各种方式有哪些?

你可以使用Spring框架。

  • 用于编写Web应用程序
  • 用于暴露RESTful服务
  • 保护你的网络应用程序
  • 与数据库进行通信
  • 处理长期运行的工作
  • 处理你必须使用的外部资源或系统
  • 用于测试目的
  • 用于独立的java项目
  • 将你的应用程序转换为可执行文件
  • 将社会媒体整合到你的应用程序中

22.NamedParameterJDBC 模板的优势是什么?

代替传统的占位符参数,'NamedParameterJDBCTemplate'使你可以使用参数来代替。它更容易维护,有助于可读性。

23.Spring vs Spring MVC vs Spring Boot的区别?

  • Spring:Spring最重要的特点是依赖性注入或控制反转。
  • Spring MVC:是一个完整的面向HTTP的MVC框架,由Spring框架管理,以Servlets为基础。它相当于JavaEE栈中的JSF。
  • Spring Boot:是一个用于快速设置应用程序的工具,提供开箱即用的配置,以构建Spring驱动的应用程序。

24.为什么Spring Bean的配置文件是必要的?

**答案:**Spring Bean配置文件可用于定义由Spring Context初始化的所有bean。在创建SpringApplicationContext 的实例时,Spring Bean配置文件会读取并初始化Spring bean XML文件。然后,一旦上下文被初始化,这些文件就可以用来获得不同的Bean实例。

25.请说出Spring框架中使用的一些设计模式?

  • 单子模式--单子范围的bean
  • 工厂模式--豆工厂类
  • 原型模式(Prototype Pattern)--原型范围的Bean。
  • 适配器模式--Spring Web和Spring MVC
  • 代理模式--支持Spring面向方面的编程
  • 模板方法模式--JdbcTemplateHibernateTemplate等。
  • 前端控制器--Spring MVCDispatcherServlet
  • 数据访问对象--支持Spring DAO
  • 模型视图控制器--Spring MVC

26.解释一下Scope Prototype的工作原理?

范围原型意味着每次我们调用Bean的一个实例时,Spring都会创建一个新的实例并返回。这与默认的单子范围不同,在单子范围中,每个Spring IoC容器只实例化一个对象实例。

27.控制Bean的生命周期事件的不同方式是什么?

有2种方法可以控制Bean的生命周期事件,即

  • InitializingBean和DisposableBean接口
  • Init-方法和destroy-方法

28.紧密耦合和松散耦合的区别是什么?

紧密耦合。严密耦合是指一组类相互之间高度依赖。
松散耦合。松散耦合是通过促进单一责任和关注点分离的设计来实现的。

29.什么是Spring DAO?

Spring数据访问对象(DAO)是Spring为JDBC、Hibernate和JPA等数据访问技术提供的支持,以一种一致和简单的方式工作。

30.Spring Bean的定义包含什么?

Spring Bean定义包含所有的配置元数据,容器需要知道如何创建一个bean,它的生命周期细节和它的依赖关系。

31.单元作用域是用来做什么的?

Singleton作用域用于无状态会话Bean。

32.说出一些AOP的概念。

不同类型的AOP概念是

  • 拦截器
  • 连接点
  • 方面
  • 目标对象
  • 编织
  • 指向性
  • 建议
  • AOP代理

33.Spring框架的事务管理有什么好处?

  • 它为不同的事务API提供了一致的编程模型,如JTA、JDBC、Hibernate、JPA和JDO。
  • 它为编程式事务管理提供了比一些复杂的事务API(如JTA)更简单的API。
  • 它支持声明式事务管理。
  • 它与Spring的各种数据访问抽象结合得非常好。

34.解释一下AOP。

面向方面的编程,或称AOP,是一种编程技术,它允许程序员将跨领域的关注点模块化,或跨越典型责任分工的行为,如日志和事务管理。

35.spring面向方面编程的优势是什么?

以下是spring AOP的优点。

  1. 它没有侵入性
  2. 可以用来实现java(这是很纯粹的)。
  3. 使用容器系统进行依赖性注入
  4. 在不直接调用的情况下实现交叉关注
  5. 有助于调节交叉切割器
  6. 可以使用XML配置和@AspectJ注解

36.建议的不同类型是什么?

以下是Spring AOP中建议的类型。

  1. 之前
  2. 运行后
  3. 运行后
  4. 抛出后
  5. 左右

37.在Spring框架中,有哪些不同类型的事件?

以下是Spring框架中的事件列表

  1. 一个自定义的事件
    1. 应用程序
    2. 发布者
    3. 监听器
  2. 异步事件
  3. 现有的框架事件
  4. 注释驱动的事件
  5. 通用支持
    1. 通用的应用程序事件
    2. 倾听者
    3. 发布者
  6. 绑定交易的事件

38.自动布线有哪些限制?

以下是spring中运行web应用程序时自动布线的缺点和限制。

  1. 自动布线并不完全精确。它可能会引起歧义,而spring无法轻松处理。
  2. Spring的文档可能无法访问自动布线的信息。
  3. 容器方面的多个Bean可能会被连接到错误的构造函数。
  4. 原始类和字符串不能被自动连接。
  5. 在spring中很有可能出现自动接线的重写。
  6. 原始数据的定义需要在自动布线中调用。
  7. 程序中的高度依赖性会造成大量的混乱。

39.什么是编织?

编织是一个对目标对象或其他应用类型应用方面的过程,以创建一个建议对象或新的代理对象。

40.你可以在哪些点上应用织补?

我们可以在以下几个点上应用织构

  • 编译时间
  • 类的加载时间
  • 运行时间

41.解释一下JoinPoint。

JoinPoint展示了应用程序中的一个点,在这个点上我们可以插入面向抽象的编程方面。这是一个实际的地方,在Spring AOP框架的帮助下,行动将被采取。

42.解释Aspect。

AOP的核心结构是方面,它将影响多个类的行为封装成可重用的模块。它是一个模块,有一套提供交叉需求的API。例如,一个日志模块将被称为AOP方面的日志。一个应用程序可以有任何数量的方面,这取决于需求。在Spring AOP中,方面是通过使用普通的类来实现的,这些类被注解为@Aspect@AspectJ 风格)。

43.解释建议

建议是指在方法执行之前或之后将采取的实际行动。这是Spring AOP框架在程序执行过程中调用的实际代码片段。

44.解释切点

pointcut是一组应该执行建议的一个或多个连接点。你可以使用表达式或模式来指定切点。

45.什么是目标对象?

目标对象是被一个或多个方面建议的对象。它总是一个代理对象。它也被称为建议对象。

46.什么是Spring框架中的代理?

在Spring框架中,代理被称为在对特定目标对象应用建议后创建的对象。

47.什么是Spring WebFlux?

Spring WebFlux是Spring的反应式堆栈Web框架,它是Spring MVC的替代品。 为了
实现这种反应式模型并具有高度的可扩展性,整个堆栈是无阻塞的。

48.WebClientWebTestClient的用途是什么?

WebClient是新的Web Reactive框架中的一个组件,可以作为一个反应式客户端来执行非阻塞的HTTP请求。因为它是反应式客户端,所以它可以处理有背压的反应式流,而且它可以充分利用Java 8 lambdas的优势。它还可以处理同步和异步的情况。

另一方面,WebTestClient是一个类似的类,我们可以在测试中使用。基本上,它是一个围绕WebClient的薄壳*。*它可以通过一个HTTP连接连接到任何服务器。它还可以使用模拟的请求和响应对象直接绑定到WebFlux应用程序,而不需要HTTP服务器。

49.使用Reactive Streams的缺点是什么?

使用反应式流有一些主要的缺点。

  • 排除反应式应用程序的故障有点困难
  • 对反应式数据存储的支持有限,因为传统的关系型数据存储还没有接受反应式范式。
  • 实施时有一个额外的学习曲线。

50.我们可以在同一个应用程序中同时使用Web MVC和WebFlux吗?

不,我们不能同时使用这两种东西。到目前为止,Spring Boot只允许使用Spring MVC或Spring WebFlux,因为Spring Boot试图根据其classpath中存在的依赖关系来自动配置上下文。
另外,Spring MVC不能在Netty上运行。此外,MVC是一种阻塞式范式,而WebFlux是一种非阻塞式。所以,我们不应该把两者混在一起,因为它们的目的不同。

51.@SpringBootApplication的作用是什么?

@SpringBootApplication注解是在Spring Boot 1.2.0中引入的,它启用了自动配置功能。
该注解封装了三个不同注解的工作。

  • @Configuration。允许开发者明确地注册Bean。
  • @ComponentScan。启用组件扫描,这样控制器类和其他组件将被自动发现,并在spring的应用程序上下文中注册为豆。
  • @EnableAutoConfiguration:启用spring boot的自动配置功能。

52.我们可以发送一个对象作为控制器处理方法的响应吗?

是的,我们可以使用@ResponseBody注解,在restful web服务中发送基于JSON或XML的响应。

53.53.@RequestParam注解是做什么的?

Spring中的@RequestParam注解将查询字符串的参数值绑定到控制器的方法参数上。

54.Spring中的@Component, @Controller, @Repository & @Service注解有什么区别?

  • **@Component。**这标志着一个java类是一个bean。它是任何Spring管理的组件的通用定型。Spring的组件扫描机制现在可以接收到它,并将其拉入应用环境中。

  • **@Controller。**这标志着一个类是Spring Web MVC控制器。用它标记的豆类会自动导入依赖注入容器。

  • **@服务。**这个注解是组件注解的一个特殊化。与@Component注解相比,它并不提供任何额外的行为。你可以在服务层类中使用@Service而不是@Component,因为它以更好的方式指定意图。

  • **@Repository。**这个注解是@Component注解的一个特殊化,具有类似的用途和功能。它专门为DAO提供了额外的好处。它将DAO导入到DI容器中,并使未检查的异常有资格被翻译成Spring DataAccessException。

55.@SpringBootApplication的作用是什么?

@SpringBootApplication注解是在Spring Boot 1.2.0中引入的,它启用了自动配置功能。
该注解封装了三个不同注解的工作。

  • @Configuration。允许开发者明确地注册Bean。
  • @ComponentScan。启用组件扫描,这样控制器类和其他组件将被自动发现,并在spring的应用程序上下文中注册为豆。
  • @EnableAutoConfiguration:启用spring boot的自动配置功能。

56.解释一下WebApplicationContext

WebApplicationContext 是普通ApplicationContext 的扩展。它有一些额外的功能,对于网络应用来说是必要的。它与普通的ApplicationContext ,在解决主题的能力和决定与哪个Servlet相关联方面有所不同。

57.如何打开注解布线?

默认情况下,Spring容器中的注解布线并没有打开。为了使用基于注解的布线,我们必须在Spring配置文件中通过配置<context:annotation-config/> 元素来启用它。

58.解释一下@RequestMapping 注释

@RequestMapping 注解用于将Web请求映射到一个处理类(即控制器)或处理方法上,它可以在方法级或类级使用。如果开发者在类层使用@RequestMapping注解,它将作为方法层路径的相对路径。

59.你对Spring MVC框架的理解是什么?

Spring MVC框架负责提供模型-视图-控制器架构以及现成的组件,用于开发灵活和松散耦合的Web应用程序。
MVC模式有助于分离应用程序的各个方面,如业务逻辑、输入逻辑和UI逻辑,此外还提供这些分离元素之间的松散耦合。

61.你说的Spring DAO支持是什么意思?

Spring DAO支持以可靠的方式简化了数据访问技术的工作,如JDBC、JDO和Hibernate。同时,它允许编码时不必担心捕捉特定技术的异常,并能轻松地在持久化技术之间进行切换。

62.你将如何使用Spring框架访问Hibernate?

使用Spring框架可以通过以下两种方式访问Hibernate。

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

63.解释一下DispatcherServlet

DispatcherServlet 是Spring Web MVC框架的本质,它处理所有的HTTP请求以及响应。在收到来自配置文件的处理程序映射条目后,DispatcherServlet ,将请求转发给控制器。
此后,控制器返回一个模型和视图的对象。之后,Dispatcher Servlet检查配置文件中关于视图解析器的条目,并调用指定的视图组件。

64.如何通过springJdbcTemplate 来获取记录?

有两个接口可以用来从数据库中获取记录。

  • ResultSetExtractor
  • RowMapper

65.JDBC和Spring JDBC之间的区别是什么?

Spring JDBC的增值是由Spring框架顶部的JDBC层提供的

  • 定义连接参数
  • 定义连接参数
  • 打开连接
  • 指定语句
  • 准备并执行该语句
  • 设置循环,对结果进行迭代(如果有)。
  • 做好每次迭代的工作
  • 处理任何异常
  • 处理交易
  • 关闭连接

66.Spring支持的ORM

Spring支持以下ORM。

  • Hibernate
  • JPA (Java Persistence API)
  • TopLink
  • JDO (Java Data Objects)
  • OJB

67.有哪些重要的Spring注解?

一些Spring注解的列表如下。

  • @Service用来表示一个类是一个服务。
  • @Scope 用来配置Spring Bean的范围。
  • @Configuration用来表示该类可以被Spring IoC容器作为Bean定义的来源。
  • @ComponentScan用于扫描一个包下所有可用的类。
  • @Required用于指示受影响的Bean属性,该属性必须在配置时通过Bean定义中的明确属性值或在自动布线的帮助下进行填充。
  • @ResponseBody用于发送一个对象作为响应,基本上用于发送XML或JSON数据作为响应。
  • @PathVariable用于将URI中的动态值映射到处理方法参数。
  • @Autowired用于在类似于@Required注解的setter方法上、构造函数上、属性上或具有任意名称和/或多个参数的方法上自动连接bean。
  • @Component用于表示一个类为一个组件,在使用基于注解的配置时,所有的类都用于自动检测并组成一个Bean。
  • @Controller用于MVC应用程序,一般与@RequestMapping注解一起使用。
  • @Repository注解表示一个组件被用作存储/检索/搜索数据的机制。
  • @Qualifier用于在有多个类似类型的Bean时,在@Autowired注解的帮助下,为单个Bean连接一个属性。
  • @Bean用于基于java的配置,用@Bean注解的方法将返回一个应该在Spring应用上下文中注册为Bean的对象。

68.使用Maven创建Spring Boot应用程序的不同方式有哪些?

以下是使用Maven创建Spring Boot应用程序的一些方法。

  • Spring Boot CLI
  • Spring Initializr
  • Spring Starter项目向导
  • Spring Maven项目

69.什么是@bean spring?

Bean是应用程序的骨干对象。这些对象由Spring IoC容器启动、组装和管理。

70.如何在spring-boot-starter-web中使用jetty而不是tomcat?

我们可以通过替换现有的依赖关系,在spring-boot-starter-web中使用jetty而不是tomcat。
第1步:找到以下依赖关系

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

第2步:将其替换为

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

第3步:添加Jetty

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

通过OpenGenus的这篇文章,你一定对Interviews的String有了很好的实践。