Spring Boot 面经

有些话、适合烂在心里 提交于 2020-02-07 02:31:23

1 什么是 Spring Boot?

Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。

2 为什么要用 Spring Boot?

  1. 独立运行
  2. 简化配置
  3. 自动配置
  4. 无代码生成和 XML 配置
  5. 应用监控
  6. 上手容易

Spring Boot 最重要的功能是:自动配置。为什么说是自动配置?

Spring Boot 的开启注解是:@SpringBootApplication,其实它就是由下面三个注解组成的:@Configuration,@ComponentScan,@EnableAutoConfiguration

上面三个注解,前面两个都是 Spring 自带的,和 Spring Boot 无关,所以说 Spring Boot 最最核心的就是这个 @EnableAutoConfiguration 注解了,它能根据类路径下的 jar 包和配置动态加载配置和注入 bean。

举个例子,比如我在 lib 下放一个 druid 连接池的 jar 包,然后在 application.yml 文件配置 druid 相关的参数,Spring Boot 就能够自动配置所有我们需要的东西,如果我把 jar 包拿掉或者把参数去掉,那 Spring Boot 就不会自动配置。

这样我们就能把许多功能做成公共的自动配置的启动器(starters),其实 druid 连接池就是这么做的,它提供了针对 Spring Boot 的启动器:druid-spring-boot-starter。

有了这个自动配置的启动器,我们就能非常简单的使用它,

先添加 jar 包依赖:

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.1.10</version>
</dependency>

再添加相关参数:

spring.datasource.url= 
spring.datasource.username=
spring.datasource.password=
……

如果是传统的项目,我们要自己手动写一大堆的配置,而且还不灵活,有了这个启动器,我们就可以做到简单集成。

3 Spring Boot 的核心配置文件有哪几个?它们的区别是什么?

Spring Boot 中有以下两种配置文件:bootstrap.properties(bootstrap.yml) 和 application.properties(application.yml)。

application 配置文件主要用于 Spring Boot 项目的自动化配置。

bootstrap 配置文件有以下几个应用场景。

  1. 使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息
  2. 一些固定的不能被覆盖的属性
  3. 一些加密/解密的场景

4 Spring Boot 的配置文件有哪几种格式?它们有什么区别?

.properties 和 .yml,它们的区别主要是书写格式不同。其中,.yml 格式不支持 @PropertySource 注解导入配置。

5 Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

启动类上面的注解是 @SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:

  1. @SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能
  2. @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class})
  3. @ComponentScan:Spring 组件扫描

6 开启 Spring Boot 特性有哪几种方式?

  1. 继承 spring-boot-starter-parent 项目
  2. 导入 spring-boot-dependencies 项目依赖

7 Spring Boot 需要独立的容器运行吗?

可以不需要,内置了 Tomcat / Jetty 等容器。

8 运行 Spring Boot 有哪几种方式?

  1. 打包用命令或者放到容器中运行
  2. 用 Maven/ Gradle 插件运行
  3. 直接执行 main 方法运行

9 Spring Boot 的目录结构是怎样的?

cn
 +- javastack
     +- MyApplication.java
     |
     +- customer
     |   +- Customer.java
     |   +- CustomerController.java
     |   +- CustomerService.java
     |   +- CustomerRepository.java
     |
     +- order
         +- Order.java
         +- OrderController.java
         +- OrderService.java
         +- OrderRepository.java

这个目录结构是主流及推荐的做法,而在主入口类上加上 @SpringBootApplication 注解来开启 Spring Boot 的各项能力,如自动配置、组件扫描等。

10 如何理解 Spring Boot 中的 Starters?

Starters 可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库,只要加入 spring-boot-starter-data-jpa 启动器依赖就能使用了。

Starters 包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。

11 如何在 Spring Boot 启动的时候运行一些特定的代码?

可以实现接口 ApplicationRunner 或者 CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个 run 方法。

12 Spring Boot 有哪几种读取配置的方式?

Spring Boot 可以通过 @PropertySource,@Value,@Environment,@ConfigurationProperties 来绑定变量。

具体可参考:Spring Boot读取配置的几种方式

13 Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?

Spring Boot 支持 Java Util Logging,Log4j2,Lockback 作为日志框架,如果你使用 Starters 启动器,Spring Boot 将使用 Logback 作为默认日志框架。

14 Spring Boot 实现热部署有哪几种方式?

所谓热部署,就是当应用正在运行时,升级软件不需要重启应用。就比如我们修改了代码的某一部分,不需要再次启动程序,并等启动完毕后再到浏览器刷新。有了热部署,我们只需启动一次程序,当有了修改后,只需刷新就好。

主要有两种方式:

  1. Spring Loaded
  2. Spring-boot-devtools

15 Spring Boot 如何定义多套不同环境配置?

Spring Boot 提供多套配置文件,在运行时可以指定具体的配置文件。

具体可参考:Spring Boot - Profile不同环境配置

16 Spring Boot 可以兼容老 Spring 项目吗,如何做?

可以兼容,使用 @ImportResource 注解导入老 Spring 项目配置文件。

17 如何理解约定大于配置?

约定优于配置是 Spring Boot 整个框架的核心思想。

约定优于配置,也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。

总结就是两点:

  1. 约定一些推荐的默认配置
  2. 开发人员只需要规定不符约定的部分

这样做的好处就是,如果约定的默认配置符合我们的要求,省略即可,反之,再进行额外配置。

从 Spring Boot 中提供的默认的配置文件(application.properties/yml),再到默认值自动配置,都可以看出约定带来的便利,以及节省大量的配置。

18 Spring Boot 中的监视器是什么?

Spring Boot actuator 是 spring 启动框架中的重要功能之一。Spring Boot 监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。

有几个指标必须在生产环境中进行检查和监控。一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息,所以监视器模块公开了一组可直接作为 HTTP URL 访问的 REST 端点来检查状态。

19 Spring Boot 自动配置的原理?

在 Spring 程序 main 方法中,添加 @SpringBootApplication 或者 @EnableAutoConfiguration
会自动去 maven 中读取每个 starter 中的 spring.factories 文件,该文件里配置了所有需要被创建 spring 容器中的 bean。

20 starter 会包含哪几个方面的内容?

  1. 自动配置文件:根据 classpath 是否存在指定的类来决定是否要执行该功能的自动配置
  2. spring.factories:非常重要,指导 Spring Boot 找到指定的自动配置文件
  3. endpoint:可以理解为一个 admin,包含对服务的描述、界面、交互(业务信息的查询)
  4. health indicator:该 starter 提供的服务的健康指标

21 Spring Boot Starter 的工作原理?

  1. Spring Boot 在启动时扫描项目所依赖的 JAR 包,寻找包含 spring.factories 文件的 JAR
  2. 根据 spring.factories 配置加载 AutoConfigure 类
  3. 根据 @Conditional 注解的条件,进行自动配置并将 Bean 注入 Spring Context

22 Spring Boot、Spring MVC 和 Spring 有什么区别?

  1. Spring:最重要的特征是依赖注入,所有 Spring Modules 不是依赖注入就是 IOC 控制反转。当我们恰当的使用 DI 或者是 IOC 的时候,我们可以开发松耦合应用。松耦合应用的单元测试可以很容易的进行
  2. SpringMVC:提供了一种分离式的方法来开发 Web 应用。通过运用像 DispatcherServelet,MoudlAndView 和 ViewResolver 等一些简单的概念,开发 Web 应用将会变的非常简单
  3. Spring Boot:Spring 和 SpringMVC 的问题在于需要配置大量的参数,Spring Boot 通过一个自动配置来解决这个问题。为了更快地构建产品就绪应用程序,Spring Boot 提供了一些非功能性特征

参考:吐血整理 20 道 Spring Boot 面试题,我经常拿来面试别人!
Spring Boot 面试,一个问题就干趴下了!
Spring Boot 面试,一个问题就干趴下了!(下)
Spring boot面试题整理

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!