SpringBoot面试常见问题
-
- 【1】什么是SpringBoot?
- 【2】SpringBoot提供了哪些核心功能?
- 【3】SpringBoot、Springmvc和Spring的区别
- 【4】如何统一引入SpringBoot版本?
- 【5】如何打包 SpringBoot 项目?
- 【6】SpringBoot如何热加载项目?
- 【7】SpringBoot的配置文件加载优先级
- 【8】SpringBoot的profile是什么?如何配置?
- 【9】Spring Boot 有哪几种读取配置的方式?
- 【10】SpringBoot2.X 有什么新特性?
- 【11】SpringBoot自动装配流程
- 【12】SpringBoot启动流程
- 【13】怎么自定义start组件?
【1】什么是SpringBoot?
Spring Boot是 Spring 的子项目,他的核心思想是自动装配,通过 Spring Boot开发者可以快速配置 Spring 项目,引入各种 Spring MVC、Spring Transaction、Spring AOP、MyBatis 等等框架,而无需不断重复编写繁重的 Spring 配置,降低了 Spring 的使用成本。Spring Boot 核心模块及各种 Starter 启动器例如:
核心模块 | 模块说明 |
---|---|
Spring-boot | 核心加载 |
Spring-boot-test | 支持Springboot的单元测试 |
Spring-boot-actuator | 监控健康管理应用 |
Spring-boot-loader | 允许你构建可用java –jar直接运行的jar包 |
Spring-boot-autoconfigure | 自动配置尝试推测用户可能需要的bean |
Spring-boot-starter-security | security权限系统的支持 |
Spring-boot-starter-amqp | 对AMQP消息队列的支持 |
Spring-boot-starter-web | web项目的支持 |
Spring-boot-starter-aop | aop的支持 |
Spring-boot-starter-jdbc | jdbc的支持 |
【2】SpringBoot提供了哪些核心功能?
可独立运行的Spring项目:Spring Boot可以以jar包的形式独立运行。
内嵌的Servlet容器:Spring Boot可以选择内嵌Tomcat、Jetty或者Undertow,无须以war包形式部署项目。
简化的Maven配置:Spring提供推荐的基础 POM 文件来简化Maven 配置。
自动配置Spring:Spring Boot会根据项目依赖来自动配置Spring 框架,极大地减少项目要使用的配置。
提供生产就绪型功能:提供可以直接在生产环境中使用的功能,如性能指标、应用信息和应用健康检查。
无代码生成和xml配置:Spring Boot不生成代码。完全不需要任何xml配置即可实现Spring的所有配置。
【3】SpringBoot、Springmvc和Spring的区别
- Spring :完整名字 Spring Framework 。它提供了多个模块,Spring IOC、Spring AOP、Spring MVC 等
- Springmvc:Spring的子项目,主要是controller层的处理,核心有处理器适配器,处理器映射器,视图解析器等
- Springboot :Spring 的子项目,他的核心思想是自动装配,通过 Spring Boot开发者可以快速配置 Spring 项目,引入各种 Spring MVC、Spring Transaction、Spring AOP、MyBatis 等等框架,而无需不断重复编写繁重的 Spring 配置,降低了 Spring 的使用成本
【4】如何统一引入SpringBoot版本?
方式一:继承 spring-boot-starter-parent
项目。配置代码如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.17.RELEASE</version>
<relativePath/>
</parent>
方式二:导入 spring-boot-dependencies 项目依赖。配置代码如下:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.17.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
因为一般我们的项目中,都有项目自己的 Maven parent 项目,所以【方式一】显然会存在冲突。所以实际场景下,推荐使用【方式二】。
【5】如何打包 SpringBoot 项目?
通过引入 spring-boot-maven-plugin
插件,执行 mvn clean package
命令,将 Spring Boot 项目打成一个 Fat Jar 。后续,我们就可以直接使用 java -jar
运行
【6】SpringBoot如何热加载项目?
通过引入 spring-boot-devtools
模块。注意,这个工具需要配置 IDEA 的自动编译。
<!--热部署配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
【7】SpringBoot的配置文件加载优先级
对于 Spring Boot 应用,默认的配置文件根目录下的 application 配置文件,当然可以是 Properties 格式,也可以是 YAML 格式。
可能有同学说,我在网上看到面试题中,说还有一个根目录下的 bootstrap 配置文件。这个是 Spring Cloud 新增的启动配置文件,需要引入 spring-cloud-context
依赖后,才会进行加载,特点和用途主要是:
- 【特点】因为 bootstrap 由父 ApplicationContext 加载,比 application 优先加载。
- 【特点】因为 bootstrap 优先于 application 加载,所以不会被它覆盖。
- 【用途】使用配置中心 Spring Cloud Config 时,需要在 bootstrap 中配置配置中心的地址,从而实现父 ApplicationContext 加载时,从配置中心拉取相应的配置到应用中。
【8】SpringBoot的profile是什么?如何配置?
profile是用来完成不同环境下,配置动态切换功能的。
profile配置方式:
多profile文件方式:
application-dev.properties/yml 开发环境
application-test.properties/yml 测试环境
application-pro.properties/yml 生产环境
yml多文档方式:
在yml中使用 — 分隔不同配置
profile激活方式:
- 配置文件: 再配置文件中配置:spring.profiles.active=dev
- 虚拟机参数:在VM options 指定:-Dspring.profiles.active=dev
- 命令行参数:java -jar XXX.jar --spring.profiles.active=dev
【9】Spring Boot 有哪几种读取配置的方式?
Spring Boot 目前支持 3 种读取配置:
- Environment:environment.getProperty(“server.port”)获得application.yml中的端口
- @Value:支持和
@PropertySource
注解一起使用,指定使用的配置文件 - @ConfigurationProperties:@ConfigurationProperties(prefix = “config-properties”),配合@EnableConfigurationProperties(value = ConfigInfo.class),开启自动配置,装配ConfigInfo的实例化对象,并且交予spring进行管理,在下面直接使用@Autowired注入configInfo对象
【10】SpringBoot2.X 有什么新特性?
- 起步 JDK 8 和支持 JDK 9
- 第三方库的升级
- Reactive Spring
- HTTP/2 支持
- 配置属性的绑定
- Gradle 插件
- Actuator 改进
- 数据支持的改进
- Web 的改进
- 支持 Quartz 自动配置
- 测试的改进
【11】SpringBoot自动装配流程
SpringBoot为我们提供了各种框架的默认配置,而默认配置生效的步骤如下:
1、系统启动加载@SpringBootApplication然后加载@EnableAutoConfiguration
2、@EnableAutoConfiguration是开启核心配置的注解,注解上@Import({AutoConfigurationImportSelector.class})
3、AutoConfigurationImportSelector中getCandidateConfigurations(annotationMetadata, attributes)加载所有配置
4、getCandidateConfigurations中使用loadSpringFactories
5、loadSpringFactories会去META-INF/spring.factories中已配置好的信息
因此,使用SpringBoot自动配置的关键有两点:
1)启动器starter
要想自动配置生效,只需要引入依赖即可,而依赖版本我们也不用操心,因为只要引入了SpringBoot提供的stater(启动器),就会自动管理依赖及版本了。
因此,玩SpringBoot的第一件事情,就是找starter,SpringBoot提供了大量的默认starter
2)全局配置yml文件
另外,SpringBoot的默认配置,都会读取默认属性,而这些属性可以通过自定义application.yml
文件来进行覆盖。这样虽然使用的还是默认配置,但是配置中的值改成了我们自定义的。
因此,玩SpringBoot的第二件事情,就是通过application.yaml
来覆盖默认属性值,形成自定义配置。
【12】SpringBoot启动流程
SpringBoot项目启动第一步就是创建SpringApplication的实例,并且调用SpringApplication.run()这个方法。
创建SpringApplication实例主要完成三件事情:
- 记录当前启动类字节码
- 判断当前项目类型,普通Servlet、响应式WebFlux、NONE
- 加载/META-INF/spring.factories文件,初始化ApplicationContextInitializer和ApplicationListener实例
而后的run()方法则会创建spring容器,流程如下:
准备监听器,监听Spring启动的各个过程
创建并配置环境参数Environment
创建ApplicationContext
prepareContext()
:初始化ApplicationContext,准备运行环境refreshContext(context)
:准备Bean工厂,调用一个BeanDefinition和BeanFactory的后处理器,初始化各种Bean,初始化tomcatafterRefresh()
:拓展功能,目前为空发布容器初始化完毕的事件
【13】怎么自定义start组件?
Spring boot的AutoConfiguration机制
标记一个应用为Springboot应用,需要一个SpringBootApplication注解,下面是一个标准的spring boot启动程序。
SpringBootApplication注解又被一个EnableAutoConfiguration注解,EnableAutoConfiguration注解就是自动加载配置的关键。
EnableAutoConfiguration是一个组合注解,用Import把AutoConfigurationImportSelector导入容器中,springboot启动的时候会加载所有的selector并执行selectImports方法,这个方法会加载META-INF/spring.factories中配置的EnableAutoConfiguration,从而加载自动配置
第一步:定义依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
第二步:使用条件注解
核心条件注解
注解 | 描述 |
---|---|
@ConditionalOnBean | 应用中包含指定bean,配置才生效 |
@ConditionalOnMissingBean | 应用中不包含指定bean,配置才生效 |
@ConditionalOnClass | 应用中包含指定类,配置才生效 |
@ConditionalOnMissingClass | 应用中不包含指定类,配置才生效 |
@ConditionalOnWebApplication | 配置只有在web环境下配置才生效 |
@ConditionalOnNotWebApplication | 配置只有在非web环境下配置才生效 |
@Conditional | 条件判定【】 |
核心条件顺序注解
注解 | 描述 |
---|---|
@AutoConfigureAfter | 在指定配置类加载之后加载 |
@AutoConfigureBefore | 在指定配置类加载之前加载 |
@AutoConfigureOrder | 指定加载配置优先级,默认0 |
第三步 定义spring.factories