# Spring Boot 面试题

# 01. Spring Boot 2.0 支持最低的 JDK 版本是?

A:JDK 6
B:JDK 7
C:JDK 8
D:JDK 9

参考答案

C

# 02. Spring、Spring Boot、Spring Cloud 是什么关系?

参考答案

它们都是来自于 Spring 大家庭,Spring Boot 是在 Spring 框架的基础上开发而来,让更加方便使用 Spring;Spring Cloud 是依赖于 Spring Boot 而构建的一套微服务治理框架。

# 03. Spring Boot 项目有哪些优势?

参考答案

Spring Boot 项目优势如下:

  • 开发变得简单,提供了丰富的解决方案,快速集成各种解决方案提升开发效率;

  • 配置变得简单,提供了丰富的 Starters,集成主流开源产品往往只需要简单的配置即可;

  • 部署变得简单,其本身内嵌启动容器,仅仅需要一个命令即可启动项目,结合 Jenkins、Docker 自动化运维非常容易实现;

  • 监控变得简单,自带监控组件,使用 Actuator 轻松监控服务各项状态。

# 04. 如何将 Spring Boot 项目打包成 war 包?

参考答案

在 pom.xml 里设置 <packaging>war</packaging>

# 05. 在 Maven 项目中如何修改打包名称?

参考答案

在 pom.xml 文件的 build 节点中,添加 finalName 节点并设置为要的名称即可,配置如下:

<build>
    <finalName>warName</finalName>
</build>

# 06. Ant、Maven、Gradle 有什么区别?

参考答案

Ant、Maven、Gradle 是 Java 领域中主要有三大构建工具,它们的区别如下:

  • Ant(Another Neat Tool)诞生于 2000 年,是由 Java 编写,采用 XML 作为构建脚本,这样就允许你在任何环境下运行构建。Ant 是 Java 领域最早的构建工具,不过因为操作复杂,慢慢的已经被淘汰了;

  • Maven 诞生于 2004 年,目的是解决程序员使用 Ant 所带来的一些问题,它的好处在于可以将项目过程规范化、自动化、高效化以及强大的可扩展性;

  • Gradle 诞生于 2009 年,是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化建构工具。它使用一种基于 Groovy 的特定领域语言来声明项目设置,而不是传统的 XML。结合了前两者的优点,在此基础之上做了很多改进,它具有 Ant 的强大和灵活,又有 Maven 的生命周期管理且易于使用。

Spring Boot 官方支持 Maven 和 Gradle 作为项目构建工具。Gradle 虽然有更好的理念,但是相比 Maven 来讲其行业使用率偏低,并且 Spring Boot 官方默认使用 Maven 。

# 07. Maven 如何设置发布的包名?

参考答案

在 build 节点下设置 finalName 就是发布的包名,如下代码所示:

<build>
    <finalName>biapi</finalName>
</build>

# 08. Spring Boot 热部署有几种方式?

参考答案

Spring Boot 热部署主要有两种方式:Spring Loaded、Spring-boot-devtools。

  • 方式 1:Spring Loaded

    在 pom.xml 文件中添加如下依赖:

    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>springloaded</artifactId>
                <version>1.2.6.RELEASE</version>
            </dependency>
        </dependencies>
        <configuration>
            <mainClass>此处为入口类</mainClass>
        </configuration>
    </plugin>
    
  • 方式 2:Spring-boot-devtools

    在 pom.xml 文件中添加如下依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>provided</scope>
        <optional>true</optional>
    </dependency>
    

# 09. Spring Boot 2.0 可以在 Tomcat 7 运行吗?为什么?

参考答案

Spring Boot 2.0 无法在 Tomcat 7 上运行。因为 Spring Boot 2.0 使用的是 Spring Framework 5,Spring Framework 5 使用的是 Servlet 3.1,而 Tomcat 7 最高支持到 Servlet 3.0,所以 Spring Boot 2.0 无法在 Tomcat 7 上运行。

# 10. 如何使用 Jetty 代替 Tomcat?

参考答案

答:在 spring-boot-starter-web 移除现有的依赖项,添加 Jetty 依赖,配置如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

# 11. Spring Boot 不支持以下哪个内嵌容器?

A:Tomcat
B:Jetty
C:Undertow
D:Nginx

参考答案

答:D

题目解析:Jetty 容器支持如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

Undertow 容器支持如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

# 12. Spring Boot 中配置文件有几种格式?

参考答案

Spring Boot 中有 .properties 和 .yml 两种配置文件格式,它们主要的区别是书写格式不同。

  • properties 配置文件格式如下:

    app.user.name = hellojava
    
  • yml 配置文件格式如下:

    app:
      user:
        name: hellojava 
    

# 13. 项目中有两个配置 application.properties 和 application.yml,以下说法正确的是?

A:application.properties 的内容会被忽略,只会识别 application.yml 的内容。
B:两个配置文件同时有效,有相同配置时,以 application.properties 文件为主。
C:application.yml 的内容会被忽略,只会识别 application.properties 的内容。

D:两个配置文件同时有效,有相同配置时,以 application.yml 文件为主。

参考答案

B

# 14. RequestMapping 和 GetMapping 有什么不同?

参考答案

RequestMapping 和 GetMapping 区别如下:

  • RequestMapping 可以支持 GET、POST、PUT 请求;
  • GetMapping 是一个组合注解,相当于 @RequestMapping(method = RequestMethod.GET) 。

# 15. 以下关于 @RestController 和 @Controller 说法正确的?

A:@Controller 返回 JSON 数据
B:@RestController 返回 JSON 数据
C:@APIController 返回 JSON 数据
D:以上都对

参考答案

B

# 16. 如何理解 Spring Boot 中的 Stater?

参考答案

Stater 可以理解为启动器,它是方便开发者快速集成其他框架到 Spring 中的一种技术。比如,spring-boot-starter-data-jpa 就是把 JPA 快速集成到 Spring 中。

# 17. 常见的 starter 有哪些?

参考答案

常见的 starter 如下:

  • spring-boot-starter-web:Web 开发支持
  • spring-boot-starter-data-jpa:JPA 操作数据库支持
  • spring-boot-starter-data-redis:Redis 操作支持
  • spring-boot-starter-data-solr:Solr 权限支持
  • mybatis-spring-boot-starter:MyBatis 框架支持

# 18. Spring Boot Starter JDBC 和 Spring JDBC 有什么关系?

参考答案

spring-boot-starter-jdbc 是 Spring Boot 针对 JDBC 的使用提供了对应的 Starter 包,在 Spring JDBC 上做了进一步的封装,方便在 Spring Boot 生态中更好的使用 JDBC。

# 19. Spring Boot 有哪几种读取配置的方式?

参考答案

Spring Boot 可以通过 @Value、@Environment、@ConfigurationProperties 这三种方式来读取。

例如,配置文件内容如下:

app.name=中文
  1. Value 方式

    @Value("${app.name}")
    private String appName;
    
  2. Environment 方式

    public class HelloController {
    
        @Autowired
        private Environment environment;
    
        @RequestMapping("/index")
        public String index(String hiName) {
            // 读取配置文件
            String appName = environment.getProperty("app.name");
            return "Hello, " + hiName + " |@" + appName;
        }
    }
    
  3. ConfigurationProperties 方式

    @ConfigurationProperties(prefix = "app")
    public class HelloController {
    
        // 读取配置文件,必须有 setter 方法
        private String name;
    
        public void setName(String name) {
            this.name = name;
        }
    
        @RequestMapping("/index")
        public String index(String hiName) {
            System.out.println("appname:" + name);
            return "Hello, " + hiName + " |@" + appName;
        }
    }
    

# 20. 使用 @Value 读取中文乱码是什么原因?如何处理?

参考答案

这是因为配置文件的编码格式导致的,需要把开发工具的编码(File Encoding)格式设置为 UTF-8 。