SpringBoot

SpringBoot高频面试题

1 什么是 Spring Boot?

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

SpringBoot高频面试题

2 为什么要用 Spring Boot?

Spring Boot的优点

● 独立运行

Spring Boot而且内嵌了各种servlet容器,Tomcat、Jetty等,现在不再需要打成war包部署到容器中,Spring Boot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内。

● 简化配置

spring-boot-starter-web启动器自动依赖其他组件,减少了maven的配置。除此之外,还提供了各种启动器,开发者能快速上手。

● 自动配置

Spring Boot能根据当前类路径下的类、jar包来自动配置bean,如添加一个spring-boot-starter-web启动器就能拥有web的功能,无需其他配置。

● 无代码生成和XML配置

Spring Boot配置过程中无代码生成,也无需XML配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是Spring4.x的核心功能之一。

● 应用监控

Spring Boot提供一系列端点可以监控服务及应用,做健康检测。

3 Spring Boot有哪些缺点?

Spring Boot虽然上手很容易,但如果你不了解其核心技术及流程,所以一旦遇到问题就很棘手,而且现在的解决方案也不是很多,需要一个完善的过程。

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

Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。

application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。

bootstrap配置文件的特性:

● boostrap 由父 ApplicationContext 加载,比 applicaton 优先加载

● boostrap 里面的属性不能被覆盖

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

● 使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;

● 一些固定的不能被覆盖的属性;

● 一些加密/解密的场景;

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

.properties 和 .yml,它们的区别主要是书写格式不同。

1).properties

app.user.name = javastack

2).yml

app:

user:

name: javastack

另外,.yml 格式不支持 @PropertySource 注解导入配置。

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

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

● @SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。

● @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,

如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。

● @ComponentScan:Spring组件扫描。

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

  1. 继承spring-boot-starter-parent项目
<parent>
<groupId>
 org.springframework.boot
</groupId>
<artifactId>
 spring-boot-starter-parent
</artifactId>
<version>
2.0.7.RELEASE
</version>
</parent>

● 如果项目已经继承了其他父项目,则可以导入spring-boot-dependencies项目依赖

<dependencyManagement>
<dependencies>
<!-- 导入SpringBoot需要使用的依赖信息 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

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

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

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

1)打包命令或者放到容器中运行

2)用 Maven/ Gradle 插件运行

3)直接执行 main 方法运行

10 Spring Boot 自动配置原理是什么?

SpringBoot的自动化配置原理可以从以下7点介绍:
与自动化配置相关的jar包是spring-boot-autoconfigure-2.1.6.RELEASE.jar
在spring-boot-autoconfigure-2.1.6.RELEASE.jar这个jar包里有个META-INF目录
META-INF目录下有个spring.factories文件
spring.factories文件中有个配置项是org.springframework.boot.autoconfigure.EnableAutoConfiguration
这个配置项对应的值就是各个具体的自动化配置类
在具体的自动化配置类上有四个(组)相关注解
@Configuration注解表示当前类是一个“配置”类
@ConditionalOnXxx注解表示当前类需要满足指定条件才会加载到IOC容器中
@EnableConfigurationProperties注解用于加载XxxProperties类
@Import注解加载运行过程中用到的类
XxxProperties类
这个类中封装了当前starter范围内常用的自动化配置信息,例如整合Redis时使用的主机地址、端口号等等。有些有默认值。
SpringBoot会读取这个类中的数据作为默认配置。
这个类同时还指定了在application.properties或application.yml中针对当前starter可以使用的配置项。所以这个类其实是SpringBoot配置文件中配置项的依据。在application.properties或application.yml中所做的配置本质上是对XxxProperties类中默认值的覆盖。
XxxProperties类需要标记@ConfigurationProperties注解才能够被SpringBoot识别
@ConfigurationProperties注解通过prefix属性指定在application.properties或application.yml中做相关配置时使用的前缀

11、你如何理解 Spring Boot 中的 Starters?

SpringBoot的starter我们翻译成“场景启动器”,是SpringBoot的一个重要特色和优势。
在一个starter中SpringBoot不仅提供了这个场景下所需要的所有依赖包而且通过版本仲裁保证所引入的依赖包版本正确,最大限度降低了jar包冲突隐患。
不仅如此SpringBoot还在starter中封装了该场景在实际开发中总结出来的最佳实践,以自动化配置的形式把常用默认配置给我们直接配置好。例如我们在使用SpringMVC时需要配置mvc:annotation-driven开启注解驱动,在引入spring-boot-web-starter后就不需要了,注解支持已经作为最佳实践整合到了starter中。还有spring-boot-web-starter里面也加入了对JSON数据解析能力的支持,这在SpringMVC中是需要程序员自己引入相关jar包的。所以SpringBoot的starter几乎做到了想要的功能一键开启、自动运行。

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

可以实现接口 ApplicationRunner 或者 CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个 run 方法,实现上述接口的类加入IOC容器即可生效。

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

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

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

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

15、SpringBoot 实现热部署有哪几种方式?

主要有两种方式:

Spring Loaded

Spring-boot-devtools

16、你如何理解 Spring Boot 配置加载顺序?

1、开发者工具 Devtools 全局配置参数;
2、单元测试上的 @TestPropertySource 注解指定的参数;
3、单元测试上的 @SpringBootTest 注解指定的参数;
4、命令行指定的参数,如 java -jar springboot.jar –name=”Java技术栈”;
5、命令行中的 SPRING_APPLICATION_JSONJSON 指定参数, 如 java -Dspring.application.json='{“name”:”Java技术栈”}’ -jar springboot.jar
6、ServletConfig 初始化参数;
7、ServletContext 初始化参数;
8、JNDI参数(如 java:comp/env/spring.application.json);
9、Java系统参数(来源:System.getProperties());
10、操作系统环境变量参数;
11、RandomValuePropertySource 随机数,仅匹配:ramdom.*;
12、JAR包外面的配置文件参数(application-{profile}.properties(YAML))
13、JAR包里面的配置文件参数(application-{profile}.properties(YAML))
14、JAR包外面的配置文件参数(application.properties(YAML))
15、JAR包里面的配置文件参数(application.properties(YAML))
16、@Configuration配置文件上 @PropertySource 注解加载的参数;
17、默认参数(通过 SpringApplication.setDefaultProperties 指定);

数字越小优先级越高,即数字小的会覆盖数字大的参数值。

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

开发阶段
基于properties配置文件
第一步
创建各环境对应的properties配置文件
applcation.properties
application-dev.properties
application-test.properties
application-prod.properties
第二步
然后在applcation.properties文件中指定当前的环境spring.profiles.active=test,这时候读取的就是application-test.properties文件。
基于yml配置文件
只需要一个applcation.yml文件就能搞定,推荐此方式。
spring:
profiles:

active: prod

spring:
profiles: dev
server:

port: 8080

spring:
profiles: test
server:

port: 8081

spring.profiles: prod
spring.profiles.include:

  • proddb
  • prodmq
    server:

port: 8082

spring:
profiles: proddb
db:

name: mysql

spring:
profiles: prodmq
mq:
address: localhost
运行阶段指定profile
通过main方法启动
// 在Eclipse Arguments里面添加
–spring.profiles.active=prod
通过插件启动
spring-boot:run -Drun.profiles=prod
通过java -jar命令启动
java -jar xx.jar –spring.profiles.active=prod

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

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

19 Spring Boot 2.X 有什么新特性?与 1.X 有什么区别?

● 依赖 JDK 版本升级:2.x 里面的许多方法应用了 JDK 8 的许多高级新特性,至少需要 JDK 8 的支持;

● 第三方类库升:2.x 对第三方类库升级了所有能升级的稳定版本,例如:Spring Framework 5+、Tomcat 8.5+、Hibernate 5.2+、Thymeleaf 3+;

● 响应式 Spring 编程:2.x 通过启动器和自动配置全面支持 Spring 的响应式编程,响应式编程是完全异步和非阻塞的,它是基于事件驱动模型,而不是传统的线程模型;

● 连接池:2.x 默认使用 HikariCP 连接池;

● json:提供了一个 spring-boot-starter-json 启动器对 JSON 读写的支持;

● Quartz:2.x 提供了一个 spring-boot-starter-quartz 启动器对定时任务框架 Quartz 的支持;

● HTTP/2 支持:提供对HTTP/2 的支持,如:Tomcat, Undertow, Jetty;

● Actuator加强:在 2.x 中,对执行器端点进行了许多改进,所有的 HTTP 执行端点现在都暴露在 /actuator路径下,并对 JSON 结果集也做了改善。