100 个经典 Spring 面试题详解(附答案)

可莉
• 阅读 422

这篇文章主要分享了 100 个 Spring 经典面试题,现在分享给大家,也给大家做个参考。正好现在金九银十,希望对大家有所帮助,觉得有用的朋友点赞支持一下哦!

100 个经典 Spring 面试题详解(附答案)

A:Spring概览

1、Spring是什么?
Spring是一个企业级Java开发框架。Spring框架的核心特性可用于开发任何Java应用程序,但也有一些扩展用于在Java EE平台上构建web应用程序。Spring框架的目标是通过基于POJO的模型,使Java EE开发更加简单。

2、Spring框架的好处?
轻量级:Spring框架是轻量级的,最基础的版本大约只有2MB。
控制反转(IOC):通过控制反转技术,实现了解耦合。对象给出它们的依赖,而不是创建或查找依赖的对象。
面向切面(AOP):Spring支持面向切面的编程,并将应用程序业务逻辑与系统服务分离。
MVC框架:Spring的WEB框架是一个设计良好的web MVC框架,它为web框架提供了一个很棒的替代方案。
容器:Spring包含并管理对象的生命周期和配置。
事务管理:Spring提供了一个一致性的事务管理接口,可以收缩到本地事务,也可以扩展到全局事务(JTA)。
异常处理:Spring提供了方便的API来将具体技术的异常(由JDBC、Hibernate或JDO抛出)转换为一致的unchecked 异常。

3、解释Core Container(Application context)模块
这是最基本的Spring模块,它提供Spring框架的基本功能。BeanFactory是任何基于spring的应用程序的核心。Spring框架是基于这个模块的,它构建了Spring容器。

4、BeanFactory实现实例
BeanFactory是工厂模式的实现,它使用控制反转来将程序的配置和依赖项与实际的业务代码分开。

5、XMLBeanFactory
最常用的是org.springframework.beans.factory.xml.XmlBeanFactory,它根据XML文件的定义加载对应的bean。这个容器从XML文件中读取配置元数据,并使用它创建完全配置化的应用程序。
100 个经典 Spring 面试题详解(附答案)

B:依赖注入

1、Spring的IOC容器是什么?
Spring IOC负责创建对象,使用依赖注入(dependency injection,DI)管理它们,将对象集中起来,配置对象,管理对象的整个生命周期。

2、IOC的好处有哪些?
IOC或依赖注入最小化应用程序代码量。
它使测试应用程序变得容易,因为单元测试中不需要单例或JNDI查找机制。
以最小的代价和最少的干扰来促进松耦合。
IOC容器支持快速实例化和懒加载。

3、Spirng中有多少种IOC容器?
BeanFactory:BeanFactory本质上只不过是高层级的工厂接口,它能够维护不同bean及其依赖项的注册表。BeanFactory使你能够读取bean定义并使用bean工厂调用它们。
ApplicationContext:ApplicationContext是Spring应用程序中的核心接口,用于向应用程序提供配置信息。它在运行时是只读的,但如果需要并且应用支持的话,可以重新加载。许多类实现了ApplicationContext接口,允许多种配置项和应用类型。

4、BeanFactory和ApplicationContext比较
Application Context:
Bean实例化/装配
BeanPostProcessor自动注册
BeanFactoryPostProcessor自动注册
方便的消息源访问(针对i18n)
ApplicationEvent发布BeanFactory:
Bean实例化/装配

5、什么是Spring中的依赖注入?
依赖注入是控制反转(IOC)的一个方面,是一个通用的概念,它有很多种表达的方式。这个概念意思你不创建你的对象,但描述他们应该如何创建。你不会在代码中直接将组件和服务耦合在一起,而是描述配置文件中的哪些组件需要哪些服务。然后由一个容器(IOC容器)负责将它们关联起来。

C.Spring Beans

1、Spring beans是什么?
Spring bean是构成Spring应用程序主干的Java对象。它们由springioc容器实例化、组装和管理。这些bean是使用提供给容器的配置元数据创建的,例如,XML中形式定义。

spring框架中定义的bean是单例bean。bean标记中有一个名为“singleton”的属性,如果指定为true,则bean为单例;如果设置为false,则bean将成为prototype bean。默认设置为true。所以,spring框架中的所有bean默认都是单例bean。

2、Spring bean定义包含什么?
Spring bean的定义包含容器如何创建Bean、其生命周期及其依赖关系所需的所有配置元数据。

3、如何向Spring容器提供配置元数据?
向Spring容器提供配置元数据有三种重要方法:

基于XML的配置文件
基于注解的配置
基于Java的配置

4、怎么定义bean的作用域?
在Spring中定义时,我们还可以为bean声明一个作用域。它可以通过bean定义中的scope属性来定义。例如,当Spring每次需要生成一个新的bean实例时,这个bean的scope属性就是prototype。另一方面,当Spring每次需要时都必须返回同一个bean实例时,bean scope属性必须设置为singleton。

5、说明Sprig支持的bean作用域
singleton:Spring将bean定义的范围限定为每个Spring IOC容器只有一个单实例。
prototype:单个bean定义有任意数量的对象实例。
request:作用域为一次http请求,该作用域仅在基于web的Spring ApplicationContext情形下有效。
session:作用域为HTTP Session,该作用域仅在基于web的Spring ApplicationContext情形下有效。
global-session:作用域为全局的HTTP session。该作用域也是仅在基于web的Spring ApplicationContext情形下有效。默认的作用域是singleton。

100 个经典 Spring 面试题详解(附答案)

D.Spring注解

1、有哪些重要的Spring注解?
我在项目中使用的一些Spring注解:

@Component:用于指示类是组件。这些类用于自动注入,并在使用基于注解的配置时配置为bean。
@Controller:是一种特定类型的组件,用于MVC应用程序,主要与@RequestMapping注解一起使用。
@Repository:用于表示组件用作存储库和存储/检索/搜索数据的操作。我们可以将此注解应用于DAO实现类。
@Service:用于指示类是服务层。
@Required:此注解简单地说明作用的bean属性必须在配置时通过bean定义中的显式属性值或通过自动注入填充。如果作用的bean属性未填充,容器将抛出BeanInitializationException。
@ResponseBody:用于将对象作为response,通常用于将XML或JSON数据作为response发送。
@PathVariable:用于将动态值从URI映射到处理方法参数。
@Autowired:对自动注入的位置和方式提供了更细粒度的控制。它可以用于在setter方法上自动注入bean。就像@Required 注解一样,修饰setter方法、构造器、属性或者具有任意名称和/或多个参数的PN方法。
@Qualifier:当有多个相同类型的bean并且只需要将一个bean自动注入时,@Qualifier注解与@Autowired注释一起使用,通过指定将连接哪个bean来消除歧义。
@Scope:配置Spring bean的作用域。
@Configuration:表示Spring IOC容器可以将该类用作bean定义的源。
@ComponentScan:应用此注解时,将扫描包下的所有可用类。
@Bean:对于基于java的配置,用@Bean注解修饰的方法将返回一个在Spring应用程序上下文中注册为Bean的对象。
用于配置切面和通知、@Aspect、@Before、@After、@Around、@Pointcut等的AspectJ注解。

2、@RequestParam注解的作用是什么?
spring中的@RequestParam注解将查询字符串的参数值绑定到控制器的方法参数。

3、注解@Primary的重要性
当有多个相同数据类型的bean时,开发人员Spring的@Primary注解,它会自动为特定bean提供更高的优先级。这个注解可以用在任何直接或间接用@Component注解修饰的类上,也可以用在用@Bean注解修饰的方法上。

4、XML配置和注解之间有什么区别?
注解的优点:

所有信息都在一个文件中
当类更改了,不用修改xml配置文件
xml配置的优点:

POJO及其行为之间更清晰地分离
当你不知道哪个POJO负责该行为时,更容易找到该POJO

5、@SpringBootApplication的作用是什么?
@SpringBootApplication注解是在springboot1.2.0中引入的,它支持自动配置特性。

此批注封装了三种不同注解的作用:

@Configuration:允许开发人员显式地注册bean
@ComponentScan:启用组件扫描,这样控制器类和其他组件将被自动发现并注册为Spring应用程序上下文中的bean
@EnableAutoConfiguration:启动SpringBoot的自动配置特性
此注解可以使用以下可选参数:

exclude:从自动配置中排除的类列表
excludeNames:从自动配置中排除完全限定类名的列表
scanBasePackage:其中提供了扫描程序包的列表
scanBasePackageClasses:提供必须应用于扫描的其他包中的类的列表

由于整理的知识点实在太多,这边只展示一部分,有需要更多面试资料的朋友可以点一点下方链接免费领取!
链接:1103806531暗号:CSDN

100 个经典 Spring 面试题详解(附答案)

E.Spring 数据访问

1、Spring JDBC API中有哪些类?
JdbcTemplate
SimpleJdbcTemplate
NamedParameterJdbcTemplate
SimpleJdbcInsert
SimpleJdbcCall

2、如何在Spring框架中更高效地使用JDBC?
使用SpringJDBC 框架,资源管理和错误处理的代价都会被减轻。所以开发者只需写statements 和 queries从数据存取数据,JDBC也可以在Spring框架提供的模板类的帮助下更有效地被使用,这个模板叫JdbcTemplate 。

3、JdbcTemplate
JdbcTemplate 类提供了很多便利的方法解决诸如把数据库数据转变成基本数据类型或对象,执行写好的或可调用的数据库操作语句,提供自定义的数据错误处理。

4、如何通过spring JdbcTemplate获取数据?
有两个接口可用于从数据库中获取数据:

ResultSetExtractor
RowMapper

5、NamedParameterJdbcTemplate的优点是什么?
NamedParameterJdbcTemplate是基于spring提供的JDBCTemplate构建的,用于与数据库的底层交互。它可以将SQL查询参数作为键值对传递。因此,与索引或“?”相比,程序代码的可读性要高得多,因此可以作为更好的标识“?“”占位符方法。特别是在参数数目庞大的情况下,后者更难跟踪。

F:Spring AOP

1、解释AOP
面向切面编程,或AOP, 是一种编程技术,允许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。

2、AOP有哪些优点?
a.它是非侵入性的

你的service/domain类被切面通知,而无需在service/domain类中添加任何与spring aop相关的类或接口。
允许开发人员专注于业务代码,而不是切点。
b.它是用纯Java实现的

不需要特殊的编译单元或特殊的类加载器
c.它使用Spring的IOC进行依赖注入

切面可以配置为普通的spring bean。
d.与任何其他AOP框架一样,它将横切关注点编织到类中,而不从这些类中调用横切关注点。

e.集中或模块化横切关注点

易于维护和更改切面
改变需要在一处进行。
在你不希望有的类中有日志记录,可以通过修改相应切面(日志切面)中的切入点来轻松实现。所以你只需要在一个地方做出改变。
f.用于使用基于模式(XML配置)或@AspectJ基于注解的方式创建切面。

g.易于配置

3、AOP有哪些实现?
AOP实现:

Spring AOP:

通过动态代理实现
它只支持方法级切入点
它是基于DTD的
Apache AspectJ:

通过aspectj java工具实现编译时编织,是通过静态代理实现的
它支持字段级切入点
它是基于模式和注解配置的

4、AOP术语有哪些?
切面
通知
切点
连接点
引入
目标对象
AOP代理
织入

5、切面
AOP的核心结构是切面,它将影响多个类的行为封装到可重用的模块中。提供了一组跨领域需求的ia模块。例如,一个日志模块将被称为AOP切面进行日志记录。根据需求,应用程序可以有任意数量的切面。在spring aop中,切面是使用带有@Aspect注释(@AspectJ样式)注解的常规类来实现的。G.Spring Model View Controller (MVC)

100 个经典 Spring 面试题详解(附答案)

H.扩展

1、Spring Security是什么?
Spring security是Spring框架中最重要的模块之一。它使开发人员能够以一种可管理的方式轻松地集成安全特性。在下面的示例中,我们将展示如何在springmvc应用程序中实现Spring安全性。

2、为什么要用SpringBoot?
以下是使用SpringBoot的一些好处:

自动配置,使用基于类路径和应用程序上下文的智能默认值,当然也可以根据需要重写它们以满足开发人员的需求。
创建Spring Boot Starter 项目时,可以选择选择需要的功能,Spring Boot将为你管理依赖关系。
SpringBoot项目可以打包成jar文件。可以使用Java-jar命令从命令行将应用程序作为独立的Java应用程序运行。
在开发web应用程序时,springboot会配置一个嵌入式Tomcat服务器,以便它可以作为独立的应用程序运行。(Tomcat是默认的,当然你也可以配置Jetty或Undertow)
SpringBoot包括许多有用的非功能特性(例如安全和健康检查)。

最后:

我这边也整理了一份 架构师全套视频教程 和关于java的系统化资料,包括java核心知识点、面试专题和20年最新的互联网真题、电子书等都有,希望对大家有所帮助!

有需要的朋友可以点一点下方链接免费领取! 链接:1103806531暗号:CSDN

100 个经典 Spring 面试题详解(附答案)

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Stella981 Stella981
2年前
100 个经典 Spring 面试题详解(附答案)
这篇文章主要分享了100个Spring经典面试题,现在分享给大家,也给大家做个参考。正好现在金九银十,希望对大家有所帮助,觉得有用的朋友点赞支持一下哦!!在这里插入图片描述(https://imgblog.csdnimg.cn/20200910203222688.jpg?xossprocessimage/watermark,type_
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这