SpringBoot面试题及答案整理

1. Spring 和 SpringBoot 有什么不一样?

Spring 框架提供多种特性使得 web 应用开发变得更简便,包括依赖注入、数据绑定、切面编程、数据存取等等。web

随着时间推移,Spring 生态变得愈来愈复杂了,而且应用程序所必须的配置文件也使人以为可怕。这就是 Spirng Boot 派上用场的地方了 – 它使得 Spring 的配置变得更垂手可得。spring

实际上,Spring 是 unopinionated(予以配置项多,倾向性弱) 的,Spring Boot 在平台和库的作法中更 opinionated ,使得咱们更容易上手。编程

这里有两条 SpringBoot 带来的好处:浏览器

  • 根据 classpath 中的 artifacts 的自动化配置应用程序
  • 提供非功能性特性例如安全和健康检查给到生产环境中的应用程序

2. 怎么使用 Maven 来构建一个 SpringBoot 程序?

就像引入其余库同样,咱们能够在 Maven 工程中加入 SpringBoot 依赖。然而,最好是从 spring-boot-starter-parent 项目中继承以及声明依赖到 Spring Boot starters。这样作可使咱们的项目能够重用 SpringBoot 的默认配置。缓存

继承 spring-boot-starter-parent 项目依赖很简单 – 咱们只须要在 pom.xml 中定义一个 parent 节点:tomcat

1 <parent>
2     <groupId>org.springframework.boot</groupId>
3     <artifactId>spring-boot-starter-parent</artifactId>
4     <version>2.1.1.RELEASE</version>
5 </parent>

咱们能够在 Maven central 中找到 spring-boot-starter-parent 的最新版本。安全

使用 starter 父项目依赖很方便,但并不是老是可行。例如,若是咱们公司都要求项目继承标准 POM,咱们就不能依赖 SpringBoot starter 了。服务器

这种状况,咱们能够经过对 POM 元素的依赖管理来处理:restful

 1 <dependencyManagement>
 2     <dependencies>
 3         <dependency>
 4             <groupId>org.springframework.boot</groupId>
 5             <artifactId>spring-boot-dependencies</artifactId>
 6             <version>2.1.1.RELEASE</version>
 7             <type>pom</type>
 8             <scope>import</scope>
 9         </dependency>
10     </dependencies>
11 </dependencyManagement>

最后,咱们能够添加 SpringBoot starter 中一些依赖,而后咱们就能够开始了。app

3. SpringBoot starter 做用在什么地方?

依赖管理是全部项目中相当重要的一部分。当一个项目变得至关复杂,管理依赖会成为一个噩梦,由于当中涉及太多 artifacts 了。

这时候 SpringBoot starter 就派上用处了。每个 stater 都在扮演着提供咱们所需的 Spring 特性的一站式商店角色。其余所需的依赖以一致的方式注入而且被管理。

全部的 starter 都归于 org.springframework.boot 组中,而且它们都以由 spring-boot-starter- 开头取名。这种命名方式使得咱们更容易找到 starter 依赖,特别是当咱们使用那些支持经过名字查找依赖的 IDE 当中

在写这篇文章的时候,已经有超过50个 starter了,其中最经常使用的是:

  • spring-boot-starter:核心 starter,包括自动化配置支持,日志以及 YAML
  • spring-boot-starter-aop:Spring AOP 和 AspectJ 相关的切面编程 starter
  • spring-boot-starter-data-jpa:使用 Hibernate Spring Data JPA 的 starter
  • spring-boot-starter-jdbc:使用 HikariCP 链接池 JDBC 的 starter
  • spring-boot-starter-security:使用 Spring Security 的 starter
  • spring-boot-starter-test:SpringBoot 测试相关的 starter
  • spring-boot-starter-web:构建 restful、springMVC 的 web应用程序的 starter

4. 怎么禁用某些自动配置特性?

若是咱们想禁用某些自动配置特性,可使用 @EnableAutoConfiguration 注解的 exclude 属性来指明。例如,下面的代码段是使 DataSourceAutoConfiguration 无效:

1 // other annotations
2 @EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
3 public class MyConfiguration { }

若是咱们使用 @SpringBootApplication 注解 — 那个将 @EnableAutoConfiguration 做为元注解的项,来启用自动化配置,咱们可以使用相同名字的属性来禁用自动化配置:

1 // other annotations
2 @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
3 public class MyConfiguration { }

咱们也可以使用 spring.autoconfigure.exclude 环境属性来禁用自动化配置。application.properties 中的这项配置可以像之前那样作一样的事情:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

5. 怎么注册一个定制的自动化配置?

为了注册一个自动化配置类,咱们必须在 META-INF/spring.factories 文件中的 EnableAutoConfiguration 键下列出它的全限定名:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.baeldung.autoconfigure.CustomAutoConfiguration

若是咱们使用 Maven 构建项目,这个文件须要放置在在 package 阶段被写入完成的 resources/META-INF 目录中。

6. 当 bean 存在的时候怎么置后执行自动配置?

为了当 bean 已存在的时候通知自动配置类置后执行,咱们可使用 @ConditionalOnMissingBean 注解。这个注解中最值得注意的属性是:

  • value:被检查的 beans 的类型
  • name:被检查的 beans 的名字

当将 @Bean 修饰到方法时,目标类型默认为方法的返回类型:

1 @Configuration
2 public class CustomConfiguration {
3     @Bean
4     @ConditionalOnMissingBean
5     public CustomService service() { ... }
6 }

7. 怎么将 SpringBoot web 应用程序部署为 JAR 或 WAR 文件?

一般,咱们将 web 应用程序打包成 WAR 文件,而后将它部署到另外的服务器上。这样作使得咱们可以在相同的服务器上处理多个项目。当 CPU 和内存有限的状况下,这是一种最好的方法来节省资源。

然而,事情发生了转变。如今的计算机硬件相比起来已经很便宜了,而且如今的注意力大多转移到服务器配置上。部署中对服务器配置的一个细小的失误都会致使无可预料的灾难发生。

Spring 经过提供插件来解决这个问题,也就是 spring-boot-maven-plugin 来打包 web 应用程序到一个额外的 JAR 文件当中。为了引入这个插件,只须要在 pom.xml 中添加一个 plugin 属性:

1 <plugin>
2     <groupId>org.springframework.boot</groupId>
3     <artifactId>spring-boot-maven-plugin</artifactId>
4 </plugin>

有了这个插件,咱们会在执行 package 步骤后获得一个 JAR 包。这个 JAR 包包含所需的全部依赖以及一个嵌入的服务器。所以,咱们再也不须要担忧去配置一个额外的服务器了。

咱们可以经过运行一个普通的 JAR 包来启动应用程序。

注意一点,为了打包成 JAR 文件,pom.xml 中的 packgaing 属性必须定义为 jar

<packaging>jar</packaging>

若是咱们不定义这个元素,它的默认值也为 jar

若是咱们想构建一个 WAR 文件,将 packaging 元素修改成 war

<packaging>war</packaging>

而且将容器依赖从打包文件中移除:

1 <dependency>
2     <groupId>org.springframework.boot</groupId>
3     <artifactId>spring-boot-starter-tomcat</artifactId>
4     <scope>provided</scope>
5 </dependency>

执行 Maven 的 package 步骤以后,咱们获得一个可部署的 WAR 文件。

8. 怎么使用 SpringBoot 去执行命令行程序?

像其余 Java 程序同样,一个 SpringBoot 命令行程序必需要有一个 main 方法。这个方法做为一个入口点,经过调用 SpringApplication#run 方法来驱动程序执行:

1 @SpringBootApplication
2 public class MyApplication {
3     public static void main(String[] args) {
4         SpringApplication.run(MyApplication.class);
5         // other statements
6     }
7 }

SpringApplication 类会启动一个 Spirng 容器以及自动化配置 beans。

要注意的是咱们必须把一个配置类传递到 run 方法中做为首要配置资源。按照惯例,这个参数通常是入口类自己。

在调用 run 方法以后,咱们能够像日常的程序同样执行其余语句。

9. 有什么外部配置的可能来源?

SpringBoot 对外部配置提供了支持,容许咱们在不一样环境中运行相同的应用。咱们可使用 properties 文件、YAML 文件、环境变量、系统参数和命令行选项参数来声明配置属性。

而后咱们能够经过 @Value 这个经过 @ConfigurationProperties 绑定的对象的注解或者实现 Enviroment 来访问这些属性。

如下是最经常使用的外部配置来源:

  • 命令行属性:命令行选项参数是以双连字符(例如,=)开头的程序参数,例如 –server.port=8080。SpringBoot将全部参数转换为属性而且添加到环境属性当中。
  • 应用属性:应用属性是指那些从 application.properties 文件或者其 YAML 副本中得到的属性。默认状况下,SpringBoot会从当前目录、classpath 根目录或者它们自身的 config 子目录下搜索该文件。
  • 特定 profile 配置:特殊概要配置是从 application-{profile}.properties 文件或者自身的 YAML 副本。{profile} 占位符引用一个在用的 profile。这些文件与非特定配置文件位于相同的位置,而且优先于它们。

10. SpringBoot 支持松绑定表明什么?

SpringBoot中的松绑定适用于配置属性的类型安全绑定。使用松绑定,环境属性的键不须要与属性名彻底匹配。这样就能够用驼峰式、短横线式、蛇形式或者下划线分割来命名。

例如,在一个有 @ConfigurationProperties 声明的 bean 类中带有一个名为 myProp 的属性,它能够绑定到如下任何一个参数中,myPropmy-propmy_prop 或者 MY_PROP

11. SpringBoot DevTools 的用途是什么?

SpringBoot 开发者工具,或者说 DevTools,是一系列可让开发过程变得简便的工具。为了引入这些工具,咱们只须要在 POM.xml 中添加以下依赖:

1 <dependency>
2     <groupId>org.springframework.boot</groupId>
3     <artifactId>spring-boot-devtools</artifactId>
4 </dependency>

spring-boot-devtools 模块在生产环境中是默认禁用的,archives 的 repackage 在这个模块中默认也被排除。所以,它不会给咱们的生产环境带来任何开销。

一般来讲,DevTools 应用属性适合于开发环境。这些属性禁用模板缓存,启用 web 组的调试日志记录等等。最后,咱们能够在不设置任何属性的状况下进行合理的开发环境配置。

每当 classpath 上的文件发生更改时,使用 DevTools 的应用程序都会从新启动。这在开发中很是有用,由于它能够为修改提供快速的反馈。

默认状况下,像视图模板这样的静态资源修改后是不会被重启的。相反,资源的更改会触发浏览器刷新。注意,只有在浏览器中安装了 LiveReload 扩展并以与 DevTools 所包含的嵌入式 LiveReload 服务器交互时,才会发生。

12. 怎么编写一个集成测试?

当咱们使用 Spring 应用去跑一个集成测试时,咱们须要一个 ApplicationContext

为了使咱们开发更简单,SpringBoot 为测试提供一个注解 – @SpringBootTest。这个注释由其 classes 属性指示的配置类建立一个 ApplicationContext

若是没有配置 classes 属性,SpringBoot 将会搜索主配置类。搜索会从包含测试类的包开始直到找到一个使用 @SpringBootApplication 或者 @SpringBootConfiguration 的类为止。

注意若是使用 JUnit4,咱们必须使用 @RunWith(SpringRunner.class) 来修饰这个测试类。

13. SpringBoot的 Actuator 是作什么的?

本质上,Actuator 经过启用 production-ready 功能使得 SpringBoot 应用程序变得更有生命力。这些功能容许咱们对生产环境中的应用程序进行监视和管理。

集成 SpringBoot Actuator 到项目中很是简单。咱们须要作的只是将 spring-boot-starter-actuator starter 引入到 POM.xml 文件当中:

1 <dependency>
2     <groupId>org.springframework.boot</groupId>
3     <artifactId>spring-boot-starter-actuator</artifactId>
4 </dependency>

SpringBoot Actuaor 可使用 HTTP 或者 JMX endpoints来浏览操做信息。大多数应用程序都是用 HTTP,做为 endpoint 的标识以及使用 /actuator 前缀做为 URL路径。

这里有一些经常使用的内置 endpoints Actuator:

  • auditevents:查看 audit 事件信息
  • env:查看 环境变量
  • health:查看应用程序健康信息
  • httptrace:展现 HTTP 路径信息
  • info:展现 arbitrary 应用信息
  • metrics:展现 metrics 信息
  • loggers:显示并修改应用程序中日志器的配置
  • mappings:展现全部 @RequestMapping 路径信息
  • scheduledtasks:展现应用程序中的定时任务信息
  • threaddump:执行 Thread Dump
相关文章
相关标签/搜索