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相关的Bean
BeanPostProcessors,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中有三种依赖注入的方式。
- 基于构造器的依赖性注入
- 基于设置器的依赖注入
- 基于字段或属性的依赖性注入
12.构造函数注入和设定器注入的区别是什么?
构造函数注入
- 它使用构造器来注入依赖关系
- 字段是通过索引访问的
- 它正确地初始化了一个类
- 它有可测试性的好处
设置器注入
- 它使用setter方法来注入依赖关系。
- 它在XML配置文件中更容易阅读
- 当使用setter注入时,不能保证完全的依赖性注入
- 与构造器注入相比,它的安全性较低
13.解释一下Singleton和Prototype作用域的使用情况?
当在spring容器中只有一个bean定义的实例被实例化时,就会使用Singleton。
原型作用域允许人们为每个被传递的请求创建新的实例
。
不需要等待容器的清除。根据你的要求,你会选择其中之一。注入可以在Bean配置文件中提到。
14.在Spring中,有几种类型的IOC容器可用?
在Spring中有两种类型的IoC容器。
BeanFactoryApplicationContext
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- 的自动布线与 相似,但适用于构造函数参数。constructorbyType
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面向方面的编程
- 模板方法模式--JdbcTemplate、HibernateTemplate等。
- 前端控制器--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的优点。
- 它没有侵入性
- 可以用来实现java(这是很纯粹的)。
- 使用容器系统进行依赖性注入
- 在不直接调用的情况下实现交叉关注
- 有助于调节交叉切割器
- 可以使用XML配置和@AspectJ注解
36.建议的不同类型是什么?
以下是Spring AOP中建议的类型。
- 之前
- 运行后
- 运行后
- 抛出后
- 左右
37.在Spring框架中,有哪些不同类型的事件?
以下是Spring框架中的事件列表
- 一个自定义的事件
- 应用程序
- 发布者
- 监听器
- 异步事件
- 现有的框架事件
- 注释驱动的事件
- 通用支持
- 通用的应用程序事件
- 倾听者
- 发布者
- 绑定交易的事件
38.自动布线有哪些限制?
以下是spring中运行web应用程序时自动布线的缺点和限制。
- 自动布线并不完全精确。它可能会引起歧义,而spring无法轻松处理。
- Spring的文档可能无法访问自动布线的信息。
- 容器方面的多个Bean可能会被连接到错误的构造函数。
- 原始类和字符串不能被自动连接。
- 在spring中很有可能出现自动接线的重写。
- 原始数据的定义需要在自动布线中调用。
- 程序中的高度依赖性会造成大量的混乱。
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.WebClient和WebTestClient的用途是什么?
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。
- 扩展HibernateDAOSupport,然后应用AOP拦截器节点
- 用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有了很好的实践。