SpringBoot常见面试题

问题:Spring 和 Spring Boot 有什么区别?

参考答案:作为 Java 开发人员对 Spring 框架都很熟悉,Spring 为 Java 程序提供了全面的基础架构支持,包含了很多非常实用的功能,如 Spring JDBC、Spring AOP、Spring ORM、Spring Test 等,这些模块的出现,大大的缩短了应用程序的开发时间,同时提高了应用开发的效率。

Spring Boot 本质上是 Spring 框架的延伸和扩展,它的诞生是为了简化 Spring 框架初始搭建以及开发的过程,使用它可以不再依赖 Spring 应用程序中的 XML 配置,为更快、更高效的开发 Spring 提供更加有力的支持。

问题:Spring Boot 有什么优点?

参考答案:Spring Boot 具有以下特点:

  1. 开发变得简单:提供一键式项目创建和快速集成各种依赖功能;
  2. 配置变得简单:提供了丰富的 Starters,集成主流开源产品往往只需要简单的配置即可;
  3. 部署变得简单:其本身内嵌启动容器,仅仅需要一个命令即可启动项目,结合 Jenkins、Docker 自动化运维非常容易实现;
  4. 监控变得简单:提供了监控组件,使用 Actuator 轻松监控服务各项状态。

问题:说一下 Spring Boot 启动流程?

参考答案:Spring Boot 启动流程要从 main 方法的 run 源码说起,它的源码如下:

public ConfigurableApplicationContext run(String… args) {

StopWatch stopWatch = new StopWatch();

stopWatch.start();

ConfigurableApplicationContext context = null;

Collection exceptionReporters = new ArrayList();

this.configureHeadlessProperty();

SpringApplicationRunListeners listeners = this.getRunListeners(args);

listeners.starting();

Collection exceptionReporters;

try {

ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);

ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);

this.configureIgnoreBeanInfo(environment);

Banner printedBanner = this.printBanner(environment);

context = this.createApplicationContext();

exceptionReporters = this.getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[]{ConfigurableApplicationContext.class}, context);

this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);

this.refreshContext(context);

this.afterRefresh(context, applicationArguments);

stopWatch.stop();

if (this.logStartupInfo) {

(new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);

}

listeners.started(context);

this.callRunners(context, applicationArguments);

} catch (Throwable var10) {

this.handleRunFailure(context, var10, exceptionReporters, listeners);

throw new IllegalStateException(var10);

}

try {

listeners.running(context);

return context;

} catch (Throwable var9) {

this.handleRunFailure(context, var9, exceptionReporters, (SpringApplicationRunListeners)null);

throw new IllegalStateException(var9);

}

}

从上面的源码可以看出,Spring Boot 的启动流程主要分为以下几个部分:

  1. 创建并启动计时器 StopWatch
  2. 装配运行时监听器 SpringApplicationRunListeners
  3. 创建应用上下文 ConfigurableApplicationContext
  4. 准备应用上下文 prepareContext
  5. 刷新应用上下文 refreshContext
  6. 刷新应用上下文后置处理 afterRefresh
  7. 调用运行监听器 listeners.started()
  8. 调用应用运行器 callRunners()
  9. 通知监听器 listeners.running()

整个启动流程还是比较复杂的,如果面试官还要继续问的话,我们可以继续深入讲解。

问题:Spring Boot 配置加载顺序是什么?

参考答案:Spring Boot 配置文件的加载顺序按照优先级从高到低的顺序如下:

  1. 命令行参数
  2. 系统环境变量
  3. 操作系统级别的 config 文件(如 application.yml)
  4. classpath 下的 config 目录中的配置文件
  5. classpath 根目录下的配置文件

所以,如果我们同时在 application.yml 和命令行中配置了相同的属性,那么命令行中的配置会覆盖 application.yml 中的配置,因为它的优先级更高。

**问题:Spring Boot 有哪几种自动装配?

参考答案:Spring Boot 的自动装配主要是通过 @EnableAutoConfiguration 注解来实现的。

自动装配的实现原理是,当 Spring Boot 启动时,会扫描 classpath 下的所有 jar 包,在 META-INF/spring.factories 文件中查找 EnableAutoConfiguration 对应的配置类,然后将这些配置类注册到 IoC 容器中。

默认情况下,spring-boot-autoconfigure jar 包中已经包含了大量我们常用的自动装配类,比如 DataSource 的自动装配、Web 的自动装配等。

如果我们需要自定义自动装配类,只需要在 @Configuration 注解的类上添加 @AutoConfigureAfter@AutoConfigureBefore 注解来指定装配顺序即可。

**问题:Spring Boot 中的 starter 是什么?

参考答案:Spring Boot 中的 starter 是 Spring Boot 提供的一种依赖管理机制。它可以帮助我们简化 Spring Boot 应用程序的搭建和开发过程。

starter 本质上就是一种 pom 文件,它包含了项目开发所需的所有依赖,并且规定了依赖的版本。这样我们在创建 Spring Boot 项目时,就不需要手动添加大量的依赖了,只需要添加对应的 starter 即可。

Spring Boot 官方提供了很多 starter,比如:

  • spring-boot-starter-web:用于构建 Web 应用程序
  • spring-boot-starter-data-jpa:用于使用 Spring Data JPA 进行数据持久化
  • spring-boot-starter-data-redis:用于使用 Redis
  • spring-boot-starter-test:用于测试
  • 等等

我们也可以自定义 starter 来提供给其他项目使用。

更多面试题关注公众号:程序员乔戈里