TARGET DECK: SpringBoot

1 基础

1.1 SpringBoot 概念

SpringBoot 是 Spring 开源组织下的子项目,简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。

1.2 SpringBoot 优点

  • 容易上手,提升开发效率
  • 内置默认的配置参数,可以开箱即用,避免繁琐的配置
  • 提供了供项目需要的非业务功能,如内嵌服务器。
  • 可以打包成 jar 文件,使用 Java-jar 命令将应用程序作为独立的 Java 应用程序执行。
  • 内置大量 Maven 的版本,避免版本冲突。

1.3 SpringBoot 核心注解

  • 核心注解是 @SpringBootApplication
    • @EnableAutoConfiguration :启动 SpringBoot 的自动配置机制,也可以使用 exclude 来关闭某个自动配置选项。
    • @SpringBootConfiguration :组合了 @Configuration 注解,实现配置文件的功能,允许在上下文中注册额外的 bean 或导入其他配置类。
    • @ComponentScan :组件扫描,会扫描被@Component 注解的 bean;注解会默认扫描启动类所在包下所有的类,使用 excludeFilters 属性来关闭不扫描某些 bean。

1.4 SpringBoot 不同环境的属性配置文件的支持

yamlproperties 文件。

application-{profile}.yaml

在 application.yaml 中通过设置 spring.profile.active=xxx 选择运行的配置版本。

1.5 SpringBoot 自动装配概念

定义了一套接口规范,在 SprigBoot 启动时会扫描外部引用 jar 包下的 META-INF/spring.factories 文件,将文件中配置的类信息加载到容器中。

1.6 SpringBoot 自动装配实现

详细见:SpringBoot 自动装配原理

自动装配的核心注解是 @EnableAutoConfiguration

该注解通过 @Import 注解将 AutoConfigurationImportSelector 类注入到容器中。Spring 扫描到该类时,会调用该类实现的 selectImports 方法,将方法返回值对应的类注入到容器中。

selectImports 方法调用了 getAutoConfigurationEntry 方法,具体的获取需要自动装配的类也是在 getAutoConfigurationEntry 方法中实现的。

方法主要包含四步:

  1. 判断是否开启自动配置开关
  2. 读取注解属性
  3. 读取需要自动配置的所有配置类
  4. 去重、去掉注解中声明的不自动装配的、根据 @ConditionalOnXXX 注解判断加载时机,最终确定要自动装配的对象。

第三步就是读取各个 jar 包下 META-INF/spring.factories 配置文件,获取里面定义的自动配置类。

1.7 如何理解 SpringBoot 中的 starters

starters 可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找示例代码和依赖包。如你想使用 SpringJPA 访问数据库,只要加入 spring-boot-starter-data-jpa 启动器依赖就能使用了。
Starters 包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。

1.8 SpringBoot 的 starter 的工作原理

Spring Boot 在启动的时候会干这几件事情:

  • Spring Boot 在启动时会去依赖的 Starter 包中寻找 resources/META-INF/spring.factories 文件,然后根据文件中配置的 Jar 包去扫描项目所依赖的 Jar 包。
  • 根据 spring.factories 配置加载 AutoConfigure 类
  • 根据@Conditional 注解的条件,进行自动配置并将 Bean 注入 Spring Context

总结一下,其实就是 Spring Boot 在启动的时候,按照约定去读取 Spring Boot Starter 的配置信息,再根据配置信息对资源进行初始化,并注入到 Spring 容器中。这样 Spring Boot 启动完毕后,就已经准备好了一切资源,使用过程中直接注入对应 Bean 资源即可。

2 配置

2.1 什么是 JavaConfig?

Spring JavaConfig 是 Spring 社区的产品,它提供了配置 Spring IoC 容器的纯 Java 方法。因此它有助于避免使用 XML 配置。使用 JavaConfig 的优点在于:
(1)面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以充分利用 Java 中的面向对象功能。一个配置类可以继承另一个,重写它的@Bean 方法等。
(2)减少或消除 XML 配置。基于依赖注入原则的外化配置的好处已被证明。但是,许多开发人员不希望在 XML 和 Java 之间来回切换。JavaConfig 为开发人员提供了一种纯 Java 方法来配置与 XML 配置概念相似的 Spring 容器。从技术角度来讲,只使用 JavaConfig 配置类来配置容器是可行的,但实际上很多人认为将 JavaConfig 与 XML 混合匹配是理想的。
(3)类型安全和重构友好。JavaConfig 提供了一种类型安全的方法来配置 Spring 容器。由于 Java 5.0 对泛型的支持,现在可以按类型而不是按名称检索 bean,不需要任何强制转换或基于字符串的查找。

2.2 SpringBoot 设置配置

properties 文件;YAML 文件;系统环境遍历;命令行参数。

2.3 SpringBoot 加载配置顺序

  1. 类路径下的配置文件
  2. 类路径内 config 子目录的配置文件
  3. 当前项目根目录下的配置文件
  4. 当前项目根目录下 config 子目录的配置文件
    加载顺序与重要性相反,以便重要性高的配置覆盖重要性低的属性

2.4 YAML 概念

YAML 是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加结构化,而且更少混淆。可以看出 YAML 具有分层配置数据。

2.5 YAML 优势

配置有序,支持数组,简洁,但是不支持 @PropertySource 注解导入自定义的 YAML 配置。

2.6 SpringBoot 是否可使用 XML 配置

SpringBoot 推荐使用 Java 配置而非 XML 配置,但是 SpringBoot 中也可以使用 XML 配置,通过 @ImportResource 注解可以引入一个 XML 配置。

2.7 SpringBoot 自定义端口

application.properties 配置文件中指定端口,如 server.port = 8090。

2.8 SpringBoot 核心配置文件是什么?bootstrap.properties 和 application.properties 有何区别 ?

单纯做 SpringBoot 开发,可能不太容易遇到 bootstra p. properties 配置文件,但是在结合 Spring Cloud 时,这个配置就会经常遇到了,特别是在需要加载一些远程配置文件的时侯。
SpringBoot 核心的两个配置文件:
bootstrap (.yml 或者.properties): boostrap 由父 ApplicationContext 加载的,比 applicaton 优先加载,配置在应用程序上下文的引导阶段生效。一般来说我们在 Spring Cloud Config 或者 Nacos 中会用到它。且 boostrap 里面的属性不能被覆盖;
application (.yml 或者.properties): 由 ApplicatonContext 加载,用于 SpringBoot 项目的自动化配置。

2.9 什么是 Spring Profiles?

Spring Profiles 允许用户根据配置文件 (dev,test,prod 等) 来注册 bean。因此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在 PRODUCTION 中,某些其他 bean 可以加载。假设我们的要求是 Swagger 文档仅适用于 QA 环境,并

3 补充

3.1 SpringBoot 项目如何热部署

SpringBoot 有 DevTools 模块,可以实现热部署,即重新加载 SpringBoot 更改而无需重启服务器。

3.2 使用过哪些 starter maven 依赖

3.3 SpringBoot starter 概念

首先,这个 Starter 并非什么新的技术点,基本上还是基于 Spring 已有功能来实现的。
首先它提供了一个自动化配置类,一般命名为 XXXAutoConfiguration ,在这个配置类中通过条件注解来决定一个配置是否生效(条件注解就是 Spring 中原本就有的)。然后它还会提供一系列的默认配置,也允许开发者根据实际情况自定义相关配置,然后通过类型安全的属性注入将这些配置属性注入进来,新注入的属性会代替掉默认属性。正因为如此,很多第三方框架,我们只需要引入依赖就可以直接使用了。当然,开发者也可以自定义 Starter。

3.4 spring-boot-starter-parent 作用

定义了 Java 编译版本为 1.8 。
使用 UTF-8 格式编码。
继承自 spring-boot-dependencies,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。
执行打包操作的配置。
自动化的资源过滤。
自动化的插件配置。
针对 application.properties 和 application.yml 的资源过滤,包括通过 profile 定义的不同环境的配置文件,例如 application-de v. properties 和 application-de v. yml。

3.5 SpringBoot 打包的 jar 和普通的 jar 的区别

SpringBoot 项目最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过 java -jar xxx.jar 命令来运行,这种 jar 不可以作为普通的 jar 被其他项目依赖,即使依赖了也无法使用其中的类。

SpringBoot 的 jar 无法被其他项目依赖,主要还是他和普通 jar 的结构不同。普通的 jar 包,解压后直接就是包名,包里就是我们的代码,而 SpringBoot 打包成的可执行 jar 解压后,在 \BOOT-INF\classes 目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在 po m. xml 文件中增加配置,将 SpringBoot 项目打包成两个 jar ,一个可执行,一个可引用。

3.6 运行 SpringBoot 有哪几种方式?

1)打包用命令或者放到容器中运行
2)用 Maven/ Gradle 插件运行
3)直接执行 main 方法运行

3.7 SpringBoot 需要独立的容器运行吗?

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

3.8 开启 SpringBoot 特性有哪几种方式?

1)继承 spring-boot-starter-parent 项目
2)导入 spring-boot-dependencies 项目依赖

3.9 如何使用 SpringBoot 实现异常处理?

Spring 提供了一种使用 ControllerAdvice 处理异常的非常有用的方法。我们通过实现一个 ControlerAdvice 类,来处理控制器类抛出的所有异常。

3.10 如何使用 SpringBoot 实现分页和排序?

使用 SpringBoot 实现分页非常简单。使用 Spring Data-JPA 可以实现将可分页的传递给存储库方法。

3.11 微服务中如何实现 session 共享 ?

在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享 session ,常见的方案就是 Spring Session + Redis 来实现 session 共享。将所有微服务的 session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。

3.12 SpringBoot 中如何实现定时任务 ?

定时任务也是一个常见的需求,SpringBoot 中对于定时任务的支持主要还是来自 Spring 框架。
在 SpringBoot 中使用定时任务主要有两种不同的方式,一个就是使用 Spring 中的 @Scheduled 注解,另一个则是使用第三方框架 Quartz。
使用 Spring 中的 @Scheduled 的方式主要通过 @Scheduled 注解来实现。
使用 Quartz ,则按照 Quartz 的方式,定义 Job 和 Trigger 即可。

4 其他

安全 & 监视器 & 整合第三方项目
SpringBoot 面试题(2020 最新版)_ThinkWon 的博客-CSDN 博客_springboot 面试题