自 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 应用程序可以细分为以下组件:
- 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 容器负责将组件与适当的服务连接起来。依赖注入可以以下列形式使用:
- 构造器注入
- 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 中最新形式的配置元数据。它有两个重要的组成部分:
- @Bean 注解——与 <bean/> 元素相同
- @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 生命周期?
回答:
- bean 生命周期从 Spring IoC 容器从 XML 文件中的 bean 定义实例化 bean 开始
- 正如 bean 定义中指定的那样,Spring 然后使用 DI 填充所有属性
- 如果 bean 实现了 BeanNameAware 接口,则通过传递 bean ID 调用 setBeanName() 方法
- 如果 bean 实现了 BeanFactoryAware 接口,则通过传递 bean 的实例来调用 setBeanFactory() 方法
- 如果有任何 BeanPostProcessors 与 bean 相关联,则调用 preProcessBeforeInitialization() 方法
- 如果为 bean 指定了init 方法,则调用该方法
- 最后,如果有任何 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:
- 扩展 HibernateDAOSupport,然后应用 AOP 拦截器节点
- 使用 Hibernate 模板和回调进行控制反转
Spring常见面试题和答案合集: 列举Spring支持的事务管理类型。
答: Spring Framework 支持两种类型的事务管理:
- 声明式事务管理——虽然事务管理与业务代码分离,但仅使用注释或基于 XML 的配置来管理事务。
- 程序化事务管理——事务通过编程进行管理。尽管极其灵活,但维护起来却非常困难。
问:请解释AOP技术。
答: AOP 或面向方面的编程是一种编程技术,它允许程序员将跨越典型职责分工或横切关注点的行为模块化。日志记录和事务管理是横切关注点的例子。
问题: Spring 的建议是什么?解释它的各种类型。
答:方面在 Spring 框架中的某个特定连接点采取的任何操作都称为 Advice。Spring AOP 使用通知来维护“围绕”连接点的拦截器链,即作为拦截器。建议可以是以下类型:
- After (finally) – 使用@After注解标记配置,在joinpoint方法之后执行,无论是正常退出还是抛出异常
- 返回后——使用@AfterReturning注解标记配置,在joinpoint方法完成正常执行后立即执行
- 抛出后 - 使用@AfterThrowing 注释标记配置,当且仅当关节点方法通过抛出异常退出时才执行
- Around - 使用@Around 注释标记配置,它在连接点方法之前和之后执行
- 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 Factory | Application 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,而无需编写显式注入逻辑。各种自动写入模式包括以下内容。
- NO。
- 按名字。
- 按类型。
- 构造函数。
问题:Spring 框架中有哪些不同类型的 Bean 作用域?
答: Spring框架中的Bean作用域主要有五种。这些包括以下内容。
- 单例。
- 原型。
- request。
- session。
- 全局session。
问题:Spring 中的切入点是什么?
答: Pointcut 是 Spring AOP 的一种表达语言。
Spring 框架有哪些不同的最新版本?
Spring框架的最新版本如下。
- Spring 2.5
- Spring 3.0
- Spring 4.0
问题:JoinPoint 是什么?
答: JoinPoint 是程序执行过程中的一个点,代表方法的执行。它包括方法的执行甚至异常的处理。
问:Spring AOP 和 AspectJ AOP 有什么区别?
答: Spring AOP 和 AspectJ AOP 有几个区别,具体如下:
Spring AOP | AspectJ AOP |
代理是通过运行时编织完成的。 | 编译时编织是通过 AspectJ Java 工具完成的 |
应用了方法级别的切入点 | 应用了字段级切入点 |
它基于 DTD | 它基于schema和注解配置 |
问题:Spring Framework 中的代理是什么?
答: Spring 框架中的代理被称为在对特定目标对象应用通知后创建对象。
问题:什么时候目标对象和代理对象是一样的?
答:在客户端对象的情况下,目标对象和代理对象是相同的。
问题:Spring框架中的weaving是什么?
答: Spring 框架中的编织是将特定方面与其他应用程序类型或对象链接的过程,以便创建建议对象。它主要在运行时执行。
问题:什么是 Spring Security?
答: Spring Security 是 Spring 框架中的一个独立模块,专注于提供可在 Java 应用程序中使用的身份验证和授权方法。
问题:什么是Spring Boot?
答: Spring Boot 是一个项目的名称,它提供了一组预配置的框架,旨在减少样板配置。它有助于使用较少的代码启动和运行 spring 应用程序。
问题:什么是响应式编程?
答:反应式编程是一个非阻塞和事件驱动的应用程序。它使用少量线程进行扩展。背压是关键因素,它确定生产者不会压倒消费者。
问题:响应式编程有什么好处?
答:反应式编程有多种好处,其中包括以下几点。
- 它有助于提高计算资源的利用率,包括多核和多 CPU 硬件。
- 它有助于通过减少序列化过程来提高性能。
问题:Reactive 系统的重要特征是什么?
答: Reactive 系统的重要特性包括以下几点。
- 消息驱动。
- 有弹性的。
- 反应灵敏。
- 弹性。
问题:定义 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 的共同特点包括以下几点。
- 它们代表流。
- 如果不使用 subscribe 方法消耗流,则无法执行它们。
- 它们是不可变的,可以一次又一次地调用以创建 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面试问题准备课程。