SpringBoot 面试常见问答总结(一)
1. 什么是 Spring Boot?
Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用Spring 的难度,简省了繁重的配置,提供了各种启动器,使开发者能快速上手。
2. 为什么要用SpringBoot?
快速开发,快速整合,配置简化、内嵌服务容器
3. SpringBoot与SpringCloud 区别?
SpringBoot是快速开发的Spring框架,SpringCloud是完整的微服务框架,SpringCloud依赖于SpringBoot。
4. Spring Boot 有哪些优点?
Spring Boot 主要有如下优点:
-  容易上手,提升开发效率,为 Spring 开发提供一个更快、更简单的开发框架。 
-  开箱即用,远离繁琐的配置。 
-  提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等。 
-  SpringBoot总结就是使编码变简单、配置变简单、部署变简单、监控变简单 
5. Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
-  @SpringBootConfiguration:组合了 @Configuration注解,实现配置文件的功能。
-  @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项。 
-  @ComponentScan:Spring组件扫描。 
6. Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?
Spring Boot 支持Java Util Logging, Log4j2, Lockback 作为日志框架,如果你使用 Starters 启动器,Spring Boot 将使用 Logback 作为默认日志框架,但是不管是那种日志框架他都支持将配置文件输出到控制台或者文件中。
7. Spring Boot 2.X 有什么新特性?与 1.X 有什么区别?
-  配置变更 
-  JDK 版本升级 
-  第三方类库升级 
-  响应式 Spring 编程支持 
-  HTTP/2 支持 
-  配置属性绑定 
-  更多改进与加强 
8. 运行 Spring Boot 有哪几种方式?
-  打包用命令或者放到容器中运行 
-  使用 Maven/ Gradle 插件运行 
-  直接执行 main 方法运行 
9. 开启 Spring Boot 特性有哪几种方式?
-  继承 spring-boot-starter-parent项目
-  导入 spring-boot-dependencies项目依赖
10. SpringBoot事务的使用?
-  启动类加上 @EnableTransactionManagement注解,开启事务支持(其实默认是开启的)。
-  在使用事务的public(只有public支持事务)方法(或者类-相当于该类的所有public方法都使用)加上 @Transactional注解。
11. Spring Boot 有哪几种读取配置的方式?
Spring Boot 可以通过@PropertySource、@Value、@Environment、@ConfigurationProperties注解来绑定变量
12. 什么是 JavaConfig?
Spring JavaConfig 是 Spring 社区的产品,Spring 3.0 引入了他,它提供了配置 Spring IOC 容器的纯Java 方法。因此它有助于避免使用 XML 配置。使用 JavaConfig 的优点在于:
-  面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以充分利用 Java 中的面向对象功能。 
-  一个配置类可以继承另一个,重写它的@Bean 方法等。减少或消除XML配置。 
-  基于依赖注入原则的外化配置的好处已被证明。但是,许多开发人员不希望在 XML 和 Java 之间来回切换。 
-  JavaConfig 为开发人员提供了一种纯 Java 方法来配置与 XML 配置概念相似的 Spring 容器。 
-  从技术角度来讲,只使用 JavaConfig 配置类来配置容器是可行的,但实际上很多人认为将JavaConfifig 与 XML 混合匹配是理想的。 
-  类型安全和重构友好。JavaConfig 提供了一种类型安全的方法来配置 Spring容器。 
-  由于 Java5.0 对泛型的支持, 
-  现在可以按类型而不是按名称检索 bean,不需要任何强制转换或基于字符串的查找。 
常用的Java config:
-  @Configuration:在类上写下此注解,表示这个类是配置类 
-  @ComponentScan:在配置类上添加 @ComponentScan注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的<context:component-scan>。
-  @Bean:bean的注入:相当于以前的 <bean id=“objectMapper” class=“org.codehaus.jackson.map.ObjectMapper” />
-  @EnableWebMvc:相当于xml的 <mvc:annotation-driven >
-  @ImportResource:相当于xml的 <import resource="applicationContextcache.xml">
13. SpringBoot的自动配置原理是什么?
主要是Spring Boot的启动类上的核心注解SpringBootApplication注解主配置类,有了这个主配置类启动时就会为SpringBoot开启一个@EnableAutoConfiguration注解自动配置功能。
有了这个EnableAutoConfiguration的话就会:
- 从配置文件META_INF/Spring.factories加载可能用到的自动配置类
- 去重,并将exclude和excludeName属性携带的类排除
- 过滤,将满足条件(@Conditional)的自动配置类返回
14. 如何理解 Spring Boot 配置加载顺序?
- properties文件;
- YAML文件;
- 系统环境变量;
- 命令行参数;
15. 什么是 YAML?
YAML 是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加结构化,而且更少混淆。可以看出 YAML 具有分层配置数据。
16. YAML 配置的优势在哪里 ?
YAML 现在可以算是非常流行的一种配置文件格式了,无论是前端还是后端,都可以见到 YAML 配置。那么 YAML 配置和传统的 properties 配置相比到底有哪些优势呢?
- 配置有序,在一些特殊的场景下,配置有序很关键
- 简洁明了,他还支持数组,数组中的元素可以是基本数据类型也可以是对象
- 相比 properties 配置文件,YAML 还有一个缺点,就是不支持@PropertySource注解导入自定义的 YAML 配置。
17. Spring Boot 是否可以使用 XML 配置 ?
Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过@ImportResource注解可以引入一个 XML 配置。
18. SpringBoot多数据源事务如何管理?
- 第一种方式是在service层的@TransactionManager中使用transactionManager指定DataSourceConfig中配置的事务
- 第二种是使用jta-atomikos实现分布式事务管理
19. 保护 Spring Boot 应用有哪些方法?
-  在生产中使用HTTPS 
-  使用Snyk检查你的依赖关系 
-  升级到最新版本 
-  启用CSRF保护 
-  使用内容安全策略防止XSS攻击 
20. 如何实现 Spring Boot 应用程序的安全性?
为了实现 Spring Boot 的安全性,使用spring-boot-starter-security依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigurerAdapter并覆盖其方法。
