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 具有以下特点:
- 开发变得简单:提供一键式项目创建和快速集成各种依赖功能;
- 配置变得简单:提供了丰富的 Starters,集成主流开源产品往往只需要简单的配置即可;
- 部署变得简单:其本身内嵌启动容器,仅仅需要一个命令即可启动项目,结合 Jenkins、Docker 自动化运维非常容易实现;
- 监控变得简单:提供了监控组件,使用 Actuator 轻松监控服务各项状态。
问题:说一下 Spring Boot 启动流程?
参考答案:Spring Boot 启动流程要从 main 方法的 run 源码说起,它的源码如下:
public ConfigurableApplicationContext run(String… args) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
Collection
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 的启动流程主要分为以下几个部分:
- 创建并启动计时器
StopWatch - 装配运行时监听器
SpringApplicationRunListeners - 创建应用上下文
ConfigurableApplicationContext - 准备应用上下文
prepareContext - 刷新应用上下文
refreshContext - 刷新应用上下文后置处理
afterRefresh - 调用运行监听器
listeners.started() - 调用应用运行器
callRunners() - 通知监听器
listeners.running()
整个启动流程还是比较复杂的,如果面试官还要继续问的话,我们可以继续深入讲解。
问题:Spring Boot 配置加载顺序是什么?
参考答案:Spring Boot 配置文件的加载顺序按照优先级从高到低的顺序如下:
- 命令行参数
- 系统环境变量
- 操作系统级别的 config 文件(如 application.yml)
- classpath 下的 config 目录中的配置文件
- 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 来提供给其他项目使用。
更多面试题关注公众号:程序员乔戈里