15 道 Spring Boot 高频面试题 看完当面霸
什么是面霸?就是在面试中,神挡杀神佛挡杀佛,见招拆招,面到面试官自惭形秽自叹不如!松哥希望本文能成为你面霸路上的垫脚石!
做 Java 开发,没有人敢小觑 Spring Boot 的重要性,现在出去面试,无论多小的公司 or 专案,都要跟你扯一扯 Spring Boot,扯一扯微服务,不会?没用过? Sorry ,我们不合适!
今天松哥就给大家整理了 15 道高频 Spring Boot 面试题,希望能够帮助到刚刚走出校门的小伙伴以及准备寻找新的工作机会的小伙伴。
传统的 SSM/SSH 框架组合配置繁琐臃肿,不同专案有很多重复、模板化的配置,严重降低了 Java 工程师的开发效率,而 Spring Boot 可以轻松建立基于 Spring 的、可以独立执行的、生产级的应用程序。通过对 Spring 家族和一些第三方库提供一系列自动化配置的 Starter,来使得开发快速搭建一个基于 Spring 的应用程序。
Spring Boot 让日益臃肿的 Java 程式码又重回简洁。在配合 Spring Cloud 使用时,还可以发挥更大的威力。
Spring Boot 主要有如下特点:
当然,开发者也可以自定义 Starter,自定义 Starter 可以参考:徒手撸一个 Spring Boot 中的 Starter ,解密自动化配置黑魔法!。
我们都知道,新建立一个 Spring Boot 专案,预设都是有 parent 的,这个 parent 就是 spring-boot-starter-parent ,spring-boot-starter-parent 主要有如下作用:
关于这个问题,读者可以参考:你真的理解 Spring Boot 专案中的 parent 吗?
YAML 现在可以算是非常流行的一种配置档案格式了,无论是前端还是后端,都可以见到 YAML 配置。那么 YAML 配置和传统的 properties 配置相比到底有哪些优势呢?
相比 properties 配置档案,YAML 还有一个缺点,就是不支援 @PropertySource 注解汇入自定义的 YAML 配置。
关于 YAML 配置,要是大家还不熟悉,可以参考: Spring Boot 中的 yaml 配置简介
跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以传送 GET 请求,无法传送其他型别的请求,在 RESTful 风格的应用中,就显得非常鸡肋,因此我们推荐在后端通过 (CORS,Cross-origin resource sharing) 来解决跨域问题。这种解决方案并非 Spring Boot 特有的,在传统的 SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML 档案中配置 CORS ,现在则是通过 @CrossOrigin 注解来解决跨域问题。关于 CORS ,小伙伴们可以参考:Spring Boot 中通过 CORS 解决跨域问题
由于 Spring Boot 官方提供了大量的非常方便的开箱即用的 Starter ,包括 Spring Security 的 Starter ,使得在 Spring Boot 中使用 Spring Security 变得更加容易,甚至只需要新增一个依赖就可以保护所有的界面,所以,如果是 Spring Boot 专案,一般选择 Spring Security 。当然这只是一个建议的组合,单纯从技术上来说,无论怎么组合,都是没有问题的。Shiro 和 Spring Security 相比,主要有如下一些特点:
在微服务中,一个完整的专案被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享 session ,常见的方案就是 Spring Session + Redis 来实现 session 共享。将所有微服务的 session 统一储存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。 session 共享大家可以参考:Spring Boot 一个依赖搞定 session 共享,没有比这更简单的方案了!
Spring Boot 实现热部署其实很容易,引入 devtools 依赖即可,这样当编译档案发生变化时,Spring Boot 就会自动重启。在 Eclipse 中,使用者按下储存按键,就会自动编译进而重启 Spring Boot,IDEA 中由于是自动储存的,自动储存时并未编译,所以需要开发者按下 Ctrl+F9 进行编译,编译完成后,专案就自动重启了。
如果仅仅只是页面模板发生变化,Java 类并未发生变化,此时可以不用重启 Spring Boot,使用 LiveReload 外挂就可以轻松实现热部署。
定时任务也是一个常见的需求,Spring Boot 中对于定时任务的支援主要还是来自 Spring 框架。
在 Spring Boot 中使用定时任务主要有两种不同的方式,一个就是使用 Spring 中的 @Scheduled 注解,另一个则是使用第三方框架 Quartz。
使用 Spring 中的 @Scheduled 的方式主要通过 @Scheduled 注解来实现。
使用 Quartz ,则按照 Quartz 的方式,定义 Job 和 Trigger 即可。
关于定时任务这一块,大家可以参考:Spring Boot 中实现定时任务的两种方式!
前后端分离开发日益流行,大部分情况下,我们都是通过 Spring Boot 做前后端分离开发,前后端分离一定会有界面文件,不然会前后端会深深陷入到扯皮中。一个比较笨的方法就是使用 word 或者 md 来维护界面文件,但是效率太低,界面一变,所有人手上的文件都得变。在 Spring Boot 中,这个问题常见的解决方案是 Swagger ,使用 Swagger 我们可以快速生成一个界面文件网站,界面一旦发生变化,文件就会自动更新,所有开发工程师访问这一个线上网站就可以获取到最新的界面文件,非常方便。关于 Swagger 的用法,大家可以参考:SpringBoot整合Swagger2,再也不用维护界面文件了!
Spring Data 是 Spring 的一个子专案。用于简化数据库访问,支援NoSQL 和 关系资料储存。其主要目标是使数据库的访问变得方便快捷。Spring Data 具有如下特点:
SpringData 专案所支援的关系资料储存技术:
Spring Data Jpa 致力于减少资料访问层 (DAO) 的开发量. 开发者唯一要做的,就是宣告持久层的界面,其他都交给 Spring Data JPA 来帮你完成!Spring Data JPA 通过规范方法的名字,根据符合规范的名字来确定方法需要实现什么样的逻辑。
Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过 @ImportResource 注解可以引入一个 XML 配置。
Spring Boot 专案最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过 java -jar xxx.jar 命令来执行,这种 jar 不可以作为普通的 jar 被其他专案依赖,即使依赖了也无法使用其中的类。
Spring Boot 的 jar 无法被其他专案依赖,主要还是他和普通 jar 的结构不同。普通的 jar 包,解压后直接就是包名,包里就是我们的程式码,而 Spring Boot 打包成的可执行 jar 解压后,在 \\BOOT-INF\\classes 目录下才是我们的程式码,因此无法被直接引用。如果非要引用,可以在 pom.xml 档案中增加配置,将 Spring Boot 专案打包成两个 jar ,一个可执行,一个可引用。
单纯做 Spring Boot 开发,可能不太容易遇到 bootstrap.properties 配置档案,但是在结合 Spring Cloud 时,这个配置就会经常遇到了,特别是在需要载入一些远端配置档案的时侯。
bootstrap.properties 在 application.properties 之前载入,配置在应用程序上下文的引导阶段生效。一般来说我们在 Spring Cloud Config 或者 Nacos 中会用到它。bootstrap.properties 被 Spring ApplicationContext 的父类载入,这个类先于载入 application.properties 的 ApplicatonContext 启动。
当然,前面叙述中的 properties 也可以修改为 yaml 。
好了,本文就说到这里,欢迎小伙伴留言说说你曾经遇到过的 Spring Boot 面试题!
这里为大家整理一些资料送给有需要的程序员,资料领取地址Java进阶架构资料
架构学习资料