SpringBoot⾯试题整理,常问SpringBoot⾯试题汇总(2020版)
博主长达两个⽉的Java⾯试结束了,并且成功拿到了阿⾥的offer!博主抽时间整理出了SpringBoot⾯试题常问的⼀些,附参考答案,分享给⼤家~~
1. 什么是 Spring Boot?
Spring Boot 是 Spring 开源组织下的⼦项⽬,是 Spring 组件⼀站式解决⽅案,主要是简化了使⽤ Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上⼿。
2. Spring Boot 有哪些优点?
Spring Boot 主要有如下优点:
1. 容易上⼿,提升开发效率,为 Spring 开发提供⼀个更快、更⼴泛的⼊门体验。
2. 开箱即⽤,远离繁琐的配置。
3. 提供了⼀系列⼤型项⽬通⽤的⾮业务性功能,例如:内嵌服务器、安全管理、运⾏数据监控、运⾏状况检查和外部化配置等。
4. 没有代码⽣成,也不需要XML配置。
5. 避免⼤量的 Maven 导⼊和各种版本冲突。
3. Spring Boot 的核⼼注解是哪个?它主要由哪⼏个注解组成的?
启动类上⾯的注解是@SpringBootApplication,它也是 Spring Boot 的核⼼注解,主要组合包含了以下 3 个注解:
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置⽂件的功能。
@EnableAutoConfiguration:打开⾃动配置的功能,也可以关闭某个⾃动配置的选项,如关闭数据源⾃动配置功能:
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
@ComponentScan:Spring组件扫描。
4. 什么是 JavaConfig?
Spring JavaConfig 是 Spring 社区的产品,它提供了配置 Spring IoC 容器的纯Java ⽅法。因此它有助
于避免使⽤ XML 配置。使⽤ JavaConfig 的优点在于:
(1)⾯向对象的配置。由于配置被定义为 JavaConfig 中的类,因此⽤户可以充分利⽤ Java 中的⾯向对象功能。⼀个配置类可以继承另⼀个,重写它的@Bean ⽅法等。
(2)减少或消除 XML 配置。基于依赖注⼊原则的外化配置的好处已被证明。但是,许多开发⼈员不希望在 XML 和 Java 之间来回切换。JavaConfig 为开发⼈员提供了⼀种纯 Java ⽅法来配置与 XML 配置概念相似的 Spring 容器。从技术⾓度来讲,只使⽤ JavaConfig 配置类来配置容器是可⾏的,但实际上很多⼈认为将JavaConfig 与 XML 混合匹配是理想的。
(3)类型安全和重构友好。JavaConfig 提供了⼀种类型安全的⽅法来配置 Spring容器。由于 Java 5.0 对泛型的⽀持,现在可以按类型⽽不是按名称检索bean,不需要任何强制转换或基于字符串的查。
5. Spring Boot ⾃动配置原理是什么?
注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是⾃动配置的核⼼,
@EnableAutoConfiguration 给容器导⼊META-INF/spring.factories ⾥定义的⾃动配置类。
筛选有效的⾃动配置类。
每⼀个⾃动配置类结合对应的 xxxProperties.java 读取配置⽂件进⾏⾃动配置功能
6. 你如何理解 Spring Boot 配置加载顺序?
在 Spring Boot ⾥⾯,可以使⽤以下⼏种⽅式来加载配置。
1)properties⽂件;
2)YAML⽂件;
3)系统环境变量;
4)命令⾏参数;
等等……
7. 什么是 YAML?
YAML 是⼀种⼈类可读的数据序列化语⾔。它通常⽤于配置⽂件。与属性⽂件相⽐,如果我们想要在配置⽂件中添加复杂的属性,YAML ⽂件就更加结构化,⽽且更少混淆。可以看出 YAML 具有分层配置数据。
8. YAML 配置的优势在哪⾥ ?
YAML 现在可以算是⾮常流⾏的⼀种配置⽂件格式了,⽆论是前端还是后端,都可以见到 YAML 配置。那么 YAML 配置和传统的 properties 配置相⽐到底有哪些优势呢?
1. 配置有序,在⼀些特殊的场景下,配置有序很关键
2. ⽀持数组,数组中的元素可以是基本数据类型也可以是对象
3. 简洁
相⽐ properties 配置⽂件,YAML 还有⼀个缺点,就是不⽀持 @PropertySource 注解导⼊⾃定义的 YAML 配置。
9. Spring Boot 是否可以使⽤ XML 配置 ?
Spring Boot 推荐使⽤ Java 配置⽽⾮ XML 配置,但是 Spring Boot 中也可以使⽤ XML 配置,通过 @ImportResource 注解可以引⼊⼀个 XML 配置。
10. application.properties 有何区别 ?
单纯做 Spring Boot 开发,可能不太容易遇到 bootstrap.properties 配置⽂件,但是在结合 Spring Cloud 时,这个配置就会经常遇到了,特别是在需要加载⼀些远程配置⽂件的时侯。
spring boot 核⼼的两个配置⽂件:
bootstrap (. yml 或者 . properties):boostrap 由⽗ ApplicationContext 加载的,⽐ applicaton 优先加载,配置在应⽤程序上下⽂的引导阶段⽣效。⼀般来说我们在 Spring Cloud Config 或者 Nacos 中会⽤到它。且 boostrap ⾥⾯的属性不能被覆盖;
application (. yml 或者 . properties):由ApplicatonContext 加载,⽤于 spring boot 项⽬的⾃动化配置。spring ioc注解
11. 什么是 Spring Profiles?
Spring Profiles 允许⽤户根据配置⽂件(dev,test,prod 等)来注册 bean。因此,当应⽤程序在开发中运⾏时,只有某些 bean 可以加载,⽽在PRODUCTION中,某些其他 bean 可以加载。假设我们的要求是 Swagger ⽂档仅适⽤于 QA 环境,并且禁⽤所有其他⽂档。这可以使⽤配置⽂件来完成。Spring Boot 使得使⽤配置⽂件⾮常简单。
12. 如何在⾃定义端⼝上运⾏ Spring Boot 应⽤程序?
为了在⾃定义端⼝上运⾏ Spring Boot 应⽤程序,您可以在application.properties 中指定端⼝。server.port = 8090
13. 如何实现 Spring Boot 应⽤程序的安全性?
为了实现 Spring Boot 的安全性,我们使⽤ spring-boot-starter-security 依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigurerAdapter 并覆盖其⽅法。
14. ⽐较⼀下 Spring Security 和 Shiro 各⾃的优缺点 ?
由于 Spring Boot 官⽅提供了⼤量的⾮常⽅便的开箱即⽤的 Starter ,包括 Spring Security 的 Starter ,使得在 Spring Boot 中使⽤ Spring Security 变得更加容易,甚⾄只需要添加⼀个依赖就可以保护所有的接⼝,所以,如果是 Spring Boot 项⽬,⼀般选择 Spring Security 。当然这只是⼀个建议的组合,单纯从技术上来说,⽆论怎么组合,都是没有问题的。Shiro 和 Spring Security 相⽐,主要有如下⼀些特点:
1. Spring Security 是⼀个重量级的安全管理框架;Shiro 则是⼀个轻量级的安全管理框架
2. Spring Security 概念复杂,配置繁琐;Shiro 概念简单、配置简单
3. Spring Security 功能强⼤;Shiro 功能简单
15. Spring Boot 中如何解决跨域问题 ?
跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以发送 GET 请求,⽆法发送其他类型的请求,在 RESTful 风格的应⽤中,就显得⾮常鸡肋,因此我们推荐在后端通过(CORS,Cross-origin resource sharing)来解决跨域问题。这种解决⽅案并⾮ Spring Boot 特有的,在传统的 SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML ⽂件中配置 CORS ,现在可以通过实现WebMvcConfigurer接⼝然后重写addCorsMappings ⽅法解决跨域问题。
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.maxAge(3600);
}
}
项⽬中前后端分离部署,所以需要解决跨域的问题。
我们使⽤cookie存放⽤户登录的信息,在spring进⾏权限控制,当权限不符合时,直接返回给⽤户固定的json结果。
当⽤户登录以后,正常使⽤;当⽤户退出登录状态时或者token过期时,由于和跨域的顺序有问题,出现了跨域的现象。
我们知道⼀个http请求,先⾛filter,到达servlet后才进⾏的处理,如果我们把cors放在filter⾥,就可以优先于权限执⾏。
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
return new CorsFilter(urlBasedCorsConfigurationSource);
}
}
16. 什么是 CSRF 攻击?
CSRF 代表跨站请求伪造。这是⼀种攻击,迫使最终⽤户在当前通过⾝份验证的Web 应⽤程序上执⾏不需要的操作。CSRF 攻击专门针对状态改变请求,⽽不是数据窃取,因为攻击者⽆法查看对伪造请求的响应。
17. Spring Boot 中的监视器是什么?
Spring boot actuator 是 spring 启动框架中的重要功能之⼀。Spring boot 监视器可帮助您访问⽣产环境中正在运⾏的应⽤程序的当前状态。有⼏个指标必须在⽣产环境中进⾏检查和监控。即使⼀些外部应⽤程序可能正在使⽤这些服务来向相关⼈员触发警报消息。监视器模块公开了⼀组可直接作为 HTTP URL 访问的REST 端点来检查状态。
18. 如何在 Spring Boot 中禁⽤ Actuator 端点安全性?
默认情况下,所有敏感的 HTTP 端点都是安全的,只有具有 ACTUATOR ⾓⾊的⽤户才能访问它们。安全性是使⽤标准的
HttpServletRequest.isUserInRole ⽅法实施的。我们可以使⽤来禁⽤安全性。只有在执⾏机构端点在防⽕墙后访问时,才建议禁⽤安全性。
19. 我们如何监视所有 Spring Boot 微服务?
Spring Boot 提供监视器端点以监控各个微服务的度量。这些端点对于获取有关应⽤程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否正常运⾏很有帮助。但是,使⽤监视器的⼀个主要缺点或困难是,我们必须单独打开应⽤程序的知识点以了解其状态或健康状况。想象⼀下涉及 50 个应⽤程序的微服务,管理员将不得不击中所有 50 个应⽤程序的执⾏终端。为了帮助我们处理这种情况,我们将使⽤位于的开源项⽬。它建⽴在 Spring Boot Actuator 之上,它提供了⼀个 Web UI,使我们能够可视化多个应⽤程序的度量。
20. 什么是 WebSockets?
WebSocket 是⼀种计算机通信协议,通过单个 TCP 连接提供全双⼯通信信道。
1、WebSocket 是双向的 -使⽤ WebSocket 客户端或服务器可以发起消息发送。
2、WebSocket 是全双⼯的 -客户端和服务器通信是相互独⽴的。
3、单个 TCP 连接 -初始连接使⽤ HTTP,然后将此连接升级到基于套接字的连接。然后这个单⼀连接⽤于所有未来的通信
4、Light -与 http 相⽐,WebSocket 消息数据交换要轻得多。
21. 什么是 Spring Data ?
Spring Data 是 Spring 的⼀个⼦项⽬。⽤于简化数据库访问,⽀持NoSQL 和关系数据存储。其主要⽬标是使数据库的访问变得⽅便快捷。Spring Data 具有如下特点:
SpringData 项⽬⽀持 NoSQL 存储:
1. MongoDB (⽂档数据库)
2. Neo4j(图形数据库)
3. Redis(键/值存储)
4. Hbase(列族数据库)
SpringData 项⽬所⽀持的关系数据存储技术:
1. JDBC
2. JPA
Spring Data Jpa 致⼒于减少数据访问层 (DAO) 的开发量. 开发者唯⼀要做的,就是声明持久层的接⼝,其他都交给 Spring Data JPA 来帮你完成!Spring Data JPA 通过规范⽅法的名字,根据符合规范的名字来确定⽅法需要实现什么样的逻辑。
22. 什么是 Spring Batch?
Spring Boot Batch 提供可重⽤的函数,这些函数在处理⼤量记录时⾮常重要,包括⽇志/跟踪,事务管理,作业处理统计信息,作业重新启动,跳过和资源管理。它还提供了更先进的技术服务和功能,通过优化和分区技术,可以实现极⾼批量和⾼性能批处理作业。简单以及复杂的⼤批量批处理作业可以⾼度可扩展的⽅式利⽤框架处理重要⼤量的信息。
23. 什么是 FreeMarker 模板?
FreeMarker 是⼀个基于 Java 的模板引擎,最初专注于使⽤ MVC 软件架构进⾏动态⽹页⽣成。使⽤ Freemarker 的主要优点是表⽰层和业务层的完全分离。程序员可以处理应⽤程序代码,⽽设计⼈员可以处理 html 页⾯设计。最后使⽤freemarker 可以将这些结合起来,给出最终的输出页⾯。
24. 如何集成 Spring Boot 和 ActiveMQ?
对于集成 Spring Boot 和 ActiveMQ,我们使⽤依赖关系。它只需要很少的配置,并且不需要样板代码。
25. 什么是 Apache Kafka?
Apache Kafka 是⼀个分布式发布 - 订阅消息系统。它是⼀个可扩展的,容错的发布 - 订阅消息系统,它使我们能够构建分布式应⽤程序。这是⼀个
Apache 顶级项⽬。Kafka 适合离线和在线消息消费。
25. 什么是 Swagger?你⽤ Spring Boot 实现了它吗?
Swagger ⼴泛⽤于可视化 API,使⽤ Swagger UI 为前端开发⼈员提供在线沙箱。Swagger 是⽤于⽣成 RESTful Web 服务的可视化表⽰的⼯具,规范和完整框架实现。它使⽂档能够以与服务器相同的速度更新。当通过 Swagger 正确定义时,消费者可以使⽤最少量的实现逻辑来理解远程服务并与其进⾏交互。因此,Swagger消除了调⽤服务时的猜测。
26. 前后端分离,如何维护接⼝⽂档 ?
前后端分离开发⽇益流⾏,⼤部分情况下,我们都是通过 Spring Boot 做前后端分离开发,前后端分离⼀定会有接⼝⽂档,不然会前后端会深深陷⼊到扯⽪中。⼀个⽐较笨的⽅法就是使⽤ word 或者 md 来维护接⼝⽂档,但是效率太低,接⼝⼀变,所有⼈⼿上的⽂档都得变。在 Spring Boot 中,这个问题常见的解决⽅案是 Swagger ,使⽤ Swagger 我们可以快速⽣成⼀个接⼝⽂档⽹站,接⼝⼀旦发⽣变化,⽂档就会⾃动更新,所有开发⼯程师访问这⼀个在线⽹站就可以获取到最新的接⼝⽂档,⾮常⽅便。
27. 如何重新加载 Spring Boot 上的更改,⽽⽆需重新启动服务器?Spring Boot项⽬如何热部署?
这可以使⽤ DEV ⼯具来实现。通过这种依赖关系,您可以节省任何更改,嵌⼊式tomcat 将重新启动。Spring Boot 有⼀个开发⼯具(DevTools)模块,它有助于提⾼开发⼈员的⽣产⼒。Java 开发⼈员⾯临的⼀个主要挑战是将⽂件更改⾃动部署到服务器并⾃动重启服务器。开发⼈员可以重新加载 Spring Boot 上的更改,⽽⽆需重新启动服务器。这将消除每次⼿动部署更改的需要。Spring Boot 在发布它的第⼀个版本时没有这个功能。这是开发⼈员最需要的功能。DevTools 模块完全满⾜开发⼈员的需求。该模块将在⽣产环境中被禁⽤。它还提供 H2 数据库控制台以更好地测试应⽤程序。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
28. 您使⽤了哪些 starter maven 依赖项?
使⽤了下⾯的⼀些依赖项
spring-boot-starter-activemq
spring-boot-starter-security
这有助于增加更少的依赖关系,并减少版本的冲突。
29. Spring Boot 中的 starter 到底是什么 ?
⾸先,这个 Starter 并⾮什么新的技术点,基本上还是基于 Spring 已有功能来实现的。⾸先它提供了⼀个⾃动化配置类,⼀般命名为XXXAutoConfiguration ,在这个配置类中通过条件注解来决定⼀个配置是否⽣效(条件注解就是 Spring 中原本就有的),然后它还会提供⼀系列的默认配置,也允许开发者根据实际情况⾃定义相关配置,然后通过类型安全的属性注⼊将这些配置属性注⼊进来,新注⼊的
属性会代替掉默认属性。正因为如此,很多第三⽅框架,我们只需要引⼊依赖就可以直接使⽤了。当然,开发者也可以⾃定义 Starter
30. spring-boot-starter-parent 有什么⽤ ?
我们都知道,新创建⼀个 Spring Boot 项⽬,默认都是有 parent 的,这个 parent 就是 spring-boot-starter-parent ,spring-boot-starter-parent 主要有如下作⽤:
1. 定义了 Java 编译版本为 1.8 。
2. 使⽤ UTF-8 格式编码。
3. 继承⾃ spring-boot-dependencies,这个⾥边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。
4. 执⾏打包操作的配置。
5. ⾃动化的资源过滤。
6. ⾃动化的插件配置。
7. 针对 application.properties 和 l 的资源过滤,包括通过 profile 定义的不同环境的配置⽂件,例如 application-dev.properties 和
31. Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?
Spring Boot 项⽬最终打包成的 jar 是可执⾏ jar ,这种 jar 可以直接通过 java -jar xxx.jar 命令来运⾏,这种 jar 不可以作为普通的 jar 被其他项⽬依赖,即使依赖了也⽆法使⽤其中的类。
Spring Boot 的 jar ⽆法被其他项⽬依赖,主要还是他和普通 jar 的结构不同。普通的 jar 包,解压后直接就是包名,包⾥就是我们的代码,⽽ Spring Boot 打包成的可执⾏ jar 解压后,在 \BOOT-INF\classes ⽬录下才是我们的代码,因此⽆法被直接引⽤。如果⾮要引⽤,可以在 l ⽂件中增加配置,将Spring Boot 项⽬打包成两个 jar ,⼀个可执⾏,⼀个可引⽤。
32. 运⾏ Spring Boot 有哪⼏种⽅式?
1)打包⽤命令或者放到容器中运⾏
2)⽤ Maven/ Gradle 插件运⾏
3)直接执⾏ main ⽅法运⾏
33. Spring Boot 需要独⽴的容器运⾏吗?
可以不需要,内置了 Tomcat/ Jetty 等容器。
34. 开启 Spring Boot 特性有哪⼏种⽅式?
1)继承spring-boot-starter-parent项⽬
2)导⼊spring-boot-dependencies项⽬依赖
35. 如何使⽤ Spring Boot 实现异常处理?
Spring 提供了⼀种使⽤ ControllerAdvice 处理异常的⾮常有⽤的⽅法。我们通过实现⼀个 ControlerAdvice 类,来处理控制器类抛出的所有异常。36. 如何使⽤ Spring Boot 实现分页和排序?
使⽤ Spring Boot 实现分页⾮常简单。使⽤ Spring Data-JPA 可以实现将可分页的传递给存储库⽅法。
37. 微服务中如何实现 session 共享 ?
在微服务中,⼀个完整的项⽬被拆分成多个不相同的独⽴的服务,各个服务独⽴部署在不同的服务器上,各⾃的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享 session ,常见的⽅案就是 Spring Session + Redis 来实现 session 共享。将所有微服务的 session 统⼀保存在Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发⼈员⽽⾔是透明的,⾮常简便。
38. Spring Boot 中如何实现定时任务 ?
定时任务也是⼀个常见的需求,Spring Boot 中对于定时任务的⽀持主要还是来⾃ Spring 框架。
在 Spring Boot 中使⽤定时任务主要有两种不同的⽅式,⼀个就是使⽤ Spring 中的 @Scheduled 注解,另⼀个则是使⽤第三⽅框架 Quartz。
使⽤ Spring 中的 @Scheduled 的⽅式主要通过 @Scheduled 注解来实现。
使⽤ Quartz ,则按照 Quartz 的⽅式,定义 Job 和 Trigger 即可。
39. 最后再送给⼤家⼀份Spring Boot学习笔记
5万字 Spring Boot 详细学习笔记(带完整⽬录)+源码免费下载,该笔记总共有19章:
课程笔记均基于我在实际项⽬中剥离出来的场景和 Demo,⽬标是带领读者快速上⼿ Spring Boot,将 Spring Boot 相关技术点快速运⽤到微服务项⽬中。以下是笔记的部分截图(可点击拉⼤):

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。