SpringBoot常见面试题汇总(超详细回答)

1.什么是SpringBoot?

Spring Boot 是一个基于 Spring 框架的开源框架,用于快速创建独立的、生产级别的、可运行的 Spring 应用程序。它采用了约定优于配置的理念,使开发者可以不需要手动配置大量的 Spring 配置文件,而快速搭建出符合生产要求的、可运行的应用程序。

Spring Boot 通过自动配置,可以自动地为开发人员配置 Spring 应用程序所需的各种组件,如数据源、Web 服务器、安全框架、模板引擎等,大大简化了开发人员的工作。此外,Spring Boot 还提供了一系列的起步依赖,可以快速地构建出一些常用的应用程序,如 Web 应用程序、消息队列应用程序、缓存应用程序等。最终,Spring Boot 还提供了一个可执行的 Jar 包,使得开发人员可以将整个应用程序打包成一个可执行的 Jar 包,方便地部署到任何一个平台上。

2.为什么使用SpringBoot?

具体来说,Spring Boot 有以下几个特点和优点:

  1. 简化配置:Spring Boot 内置了许多开箱即用的配置,可以让开发者不用手动配置大量的 XML 配置文件,从而减少了开发时间和出错概率。

  1. 嵌入式 Web 容器:Spring Boot 默认采用 Tomcat 作为嵌入式 Web 容器,也支持 Jetty 和 Undertow,可以让应用程序在独立运行的情况下启动一个 Web 容器,使得应用程序更加轻量级。

  1. 自动配置:Spring Boot 通过自动配置的方式,根据应用程序所依赖的类和 jar 包,自动配置需要的组件和配置,可以让开发者只需专注于业务开发,而不用关注 Spring 配置的细节。

  1. 无代码生成和 XML 配置:Spring Boot 采用注解配置和约定优于配置的方式,避免了繁琐的 XML 配置和代码生成。

  1. 依赖管理:Spring Boot 帮助开发者自动管理和升级应用程序所依赖的 jar 包版本,避免了依赖版本不一致或者缺失的问题。

3.Spring、Spring MVC和SpringBoot有什么区别?

  1. Spring是一个Java开发框架,主要用于创建企业级Java应用程序,它提供了依赖注入(DI)和面向切面编程(AOP)等功能。

  1. Spring MVC是Spring框架的一个模块,用于创建Web应用程序,它使用控制器、视图和模型来实现MVC设计模式。

  1. Spring Boot是一个基于Spring框架的快速开发应用程序的工具,它使用自动配置来减少了开发人员的工作量,可以快速创建可独立运行的Spring应用程序。

可以说,Spring是基础框架,Spring MVC是基于Spring的Web框架,而Spring Boot则是基于Spring的快速开发框架。

下面是它们之间的一些区别:

  1. Spring需要手动配置,而Spring Boot通过自动配置来减少配置量。

  1. Spring MVC需要在web.xml中配置DispatcherServlet,而Spring Boot可以自动配置DispatcherServlet。

  1. Spring需要开发人员自己配置应用程序的各个部分,而Spring Boot可以通过注解自动配置,大大降低了配置的难度和时间。

  1. Spring Boot内嵌了Tomcat、Jetty等Web容器,可以直接运行Web应用程序,而Spring MVC需要部署到Web容器中才能运行。

4.SpringBoot自动配置的原理?

Spring Boot 的核心理念是约定优于配置(Convention over Configuration),旨在通过提供一系列默认配置来简化应用程序的开发和部署。其中最重要的一个特性是自动配置(Auto-configuration)。

Spring Boot 的自动配置是基于 Spring 的条件化配置(Conditional Configuration)功能实现的。Spring Boot 会根据应用程序的依赖关系和其他一些因素来决定需要自动配置哪些组件,以及如何配置这些组件。

@EnableAutoConfiguration是Spring Boot自动配置的核心,其实现原理主要包括以下几个步骤:

  1. Spring Boot在启动时,会扫描classpath下的META-INF/spring.factories文件,并解析其中的EnableAutoConfiguration实现类。

  1. Spring Boot将自动配置实现类加载到容器中,并对自动配置进行条件判断。条件不满足的自动配置将被过滤掉,只有满足条件的自动配置才会生效。

  1. Spring Boot会根据当前应用所依赖的jar包,自动配置需要的Bean,如DataSource、JdbcTemplate等。

  1. Spring Boot还提供了一些默认的配置,如端口号、上下文路径等,这些配置也是通过自动配置实现的。

总的来说,Spring Boot自动配置的原理就是利用@EnableAutoConfiguration和条件注解实现了对Bean的自动配置,并且提供了默认的配置,可以帮助开发者快速搭建一个基于Spring Boot的Web应用程序。

5.Spring Boot的核心注解是哪些?

Spring Boot 的核心注解主要包括:

  1. @SpringBootApplication:一个复合注解,包括了@Configuration@EnableAutoConfiguration@ComponentScan 三个注解,用于标识 Spring Boot 应用的主类。

  1. @Configuration:表明该类是一个 Java 配置类,用于定义 Spring Bean 的配置信息。

  1. @EnableAutoConfiguration:自动配置注解,用于开启 Spring Boot 的自动配置功能。

  1. @ComponentScan:用于自动扫描和注册 Spring Bean。

除此之外,还有一些常用的注解,如:

  1. @RestController:用于定义 RESTful 接口,相当于 @Controller@ResponseBody 的组合。

  1. @RequestMapping:用于定义 HTTP 请求的映射,用于处理 HTTP 请求。

  1. @Autowired:自动注入注解,用于自动装配 Spring Bean。

  1. @Value:属性注入注解,用于注入配置文件中的属性值。

这些注解共同组成了 Spring Boot 应用的核心框架。

6.SpringBoot的核心配置文件有哪几个?他们的区别是什么?

Spring Boot的核心配置文件有以下几个:

  1. application.properties

  1. application.yml

  1. bootstrap.properties

  1. bootstrap.yml

其中,application.properties和application.yml是应用程序的配置文件,而bootstrap.properties和bootstrap.yml是用于Spring Boot上下文的配置文件。它们之间的区别在于加载的优先级不同,bootstrap配置文件的优先级更高,可以用于设置一些比较敏感和重要的配置信息。

application.properties是以键值对的形式进行配置的,例如:

server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/test

application.yml则采用缩进的方式进行配置,例如:

server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test

在Spring Boot应用程序中,我们可以使用这些配置文件来配置应用程序、数据库、日志等方面的配置信息,简化了应用程序的配置过程。在Spring Boot中,这些配置文件的属性可以通过注解@Value注入到Java类中,并且可以通过@ConfigurationProperties注解来将一组属性绑定到一个类中。

7.什么是Spring Boot Starter?有哪些常用的?

Spring Boot Starter是一种特殊的依赖关系,它是为了方便Spring Boot应用程序的快速启动和集成而设计的。一个Starter通常会包含多个相关的依赖库,以及自动配置和其他必要的配置文件,使得我们只需引入一个Starter依赖,即可快速地集成相关的技术或库。

常用的Spring Boot Starter包括:

  1. spring-boot-starter-web:适用于开发Web应用程序的Starter,包含Spring MVC、Tomcat和Spring Boot Web自动配置等。

  1. spring-boot-starter-data-jpa:适用于使用JPA的Starter,包含Hibernate、Spring Data JPA、Spring ORM等依赖。

  1. spring-boot-starter-data-redis:适用于使用Redis的Starter,包含Jedis客户端和Spring Data Redis等依赖。

  1. spring-boot-starter-test:适用于测试的Starter,包含JUnit、Mockito、Hamcrest、Spring Test等依赖。

  1. spring-boot-starter-actuator:适用于监控和管理Spring Boot应用程序的Starter,包含Spring Boot Actuator和Spring Boot Web等依赖。

通过使用Spring Boot Starter,我们可以非常方便地集成常用的技术和库,大大提高了开发效率和便捷性。

8.spring-boot-starter-parent有什么作用?

spring-boot-starter-parent 是 Spring Boot 官方提供的一个 Maven 父工程,作为 Spring Boot 项目的父工程,继承了一些常用依赖的版本号和插件的配置,可以方便地引入 Spring Boot 的依赖,减少了手动配置的复杂度和出错的概率,同时也确保了 Spring Boot 依赖之间的兼容性。

具体来说,spring-boot-starter-parent 主要作用有以下几个方面:

  1. 统一管理 Spring Boot 项目中常用的依赖版本号,确保版本兼容性。

  1. 配置一些常用的 Maven 插件,如 Maven Compiler Plugin、Maven Surefire Plugin、Maven JAR Plugin 等,避免手动配置繁琐。

  1. 定义了一些项目构建的通用属性,如项目的编码、构建时间、Java 版本等,可以在子模块中继承并重写。

在使用 Spring Boot 时,一般会将自己的项目的 pom.xml 中的 parent 元素设置为 spring-boot-starter-parent,这样就可以使用 Spring Boot 推荐的依赖版本和配置,并继承了 spring-boot-starter-parent 中的配置和属性。

9.如何自定义Spring Boot Starter?

自定义Spring Boot Starter可以让开发者将自己的库或框架封装成一个可重用的starter,使得其他开发者能够更加方便地使用和集成该库或框架。下面是自定义Spring Boot Starter的步骤:

  1. 创建Maven或Gradle项目,命名为my-starter

  1. 在项目的src/main/resources目录下创建META-INF/spring.factories文件,内容如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.my_starter.MyAutoConfiguration

这个文件的作用是告诉Spring Boot在启动时自动加载MyAutoConfiguration配置类。

  1. 创建MyAutoConfiguration配置类,并在类上加上@Configuration注解,用于标识该类是一个配置类。

  1. MyAutoConfiguration中定义需要自动配置的Bean。

  1. 打包my-starter项目,并将生成的jar包上传到Maven仓库中。

  1. 在其他项目中使用自定义的starter,只需要在项目的pom.xml文件中添加以下依赖:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>my-starter</artifactId>
    <version>1.0.0</version>
</dependency>

然后就可以使用自定义的starter了。

需要注意的是,自定义的starter应该遵循一定的命名规范,命名方式为:spring-boot-starter-{name},其中name是该starter的名称。例如,如果你要创建一个名为my-starter的starter,那么你的项目应该命名为spring-boot-starter-my-starter。这样做的好处是,其他开发者可以更容易地找到和使用你的starter。

10.为什么需要spring-boot-maven-plugin?

Spring Boot提供了许多便捷的功能,如自动配置、快速开发等,但是这些功能需要一些额外的构建配置。为了简化构建配置的复杂度,Spring Boot提供了一个Maven插件:spring-boot-maven-plugin。

spring-boot-maven-plugin主要用于将Spring Boot应用程序打包成可执行的Jar或War包。它可以将应用程序及其依赖项打包到一个可执行的Jar或War文件中,还可以包含一个嵌入式的Tomcat容器或Jetty容器,以便于部署和运行。

除了构建可执行的Jar或War包之外,spring-boot-maven-plugin还提供了其他的一些功能,例如:

  • 运行Spring Boot应用程序:可以使用spring-boot:run命令在开发阶段启动Spring Boot应用程序。

  • 打包依赖项:可以使用spring-boot:repackage命令将依赖项打包到可执行的Jar或War文件中,以便于部署和运行。

  • 生成Spring Boot项目文档:可以使用spring-boot:help命令生成Spring Boot项目的文档。

11.SpringBoot 打成jar和普通的jar有什么区别?

Spring Boot应用打成的jar和普通的jar包在打包的方式和使用方式上有一些区别。

首先,Spring Boot打成的jar包是一种可执行的jar包,包含了内嵌的Tomcat、Jetty等Web服务器,可以直接运行。而普通的jar包只包含类、资源等,需要在外部环境中手动配置Web服务器才能运行。

其次,Spring Boot打成的jar包中包含了启动类的main方法,可以直接运行该jar包来启动应用程序。而普通的jar包中没有默认的main方法,需要手动指定启动类来运行应用程序。

此外,Spring Boot打成的jar包还包含了一些默认的配置文件,例如application.properties或application.yml,这些文件可以用于配置应用程序的属性、数据源等信息。而普通的jar包不包含这些默认的配置文件。

最后,Spring Boot打成的jar包可以使用spring-boot-maven-plugin插件来打包,该插件可以帮助我们将应用程序的依赖项、配置文件等全部打包进一个可执行的jar包中,方便部署和运行。而普通的jar包需要手动处理依赖项、配置文件等,比较繁琐。

12.如何使用Spring Boot实现异常处理?

在Spring Boot中,可以使用@ControllerAdvice注解来定义一个全局异常处理类,处理系统中出现的所有异常。

下面是一个简单的示例:

@ControllerAdvice
public class GlobalExceptionHandler {
    
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Map<String, Object> handleException(Exception e) {
        Map<String, Object> result = new HashMap<>();
        result.put("status", "error");
        result.put("message", e.getMessage());
        return result;
    }
    
    @ExceptionHandler(value = BusinessException.class)
    @ResponseBody
    public Map<String, Object> handleBusinessException(BusinessException e) {
        Map<String, Object> result = new HashMap<>();
        result.put("status", "error");
        result.put("code", e.getCode());
        result.put("message", e.getMessage());
        return result;
    }
    
}

在上面的代码中,@ControllerAdvice注解表示这是一个全局异常处理类。@ExceptionHandler注解用来指定处理哪种异常,@ResponseBody注解用来将处理结果以JSON格式返回给客户端。

在处理异常时,可以根据异常类型的不同,返回不同的结果。例如,如果是BusinessException异常,可以在返回结果中包含一个错误码。

当系统中出现异常时,Spring Boot会自动将异常交给全局异常处理类进行处理。如果没有找到匹配的异常处理方法,则会返回一个默认的错误页面。

除了@ControllerAdvice注解,Spring Boot还提供了@ExceptionHandler和@ResponseStatus注解,可以用来定义局部异常处理方法和自定义HTTP状态码。

13.SpringBoot 实现热部署有哪几种方式?

  1. 使用 Spring DevTools:Spring Boot 提供了一个名为 Spring DevTools 的工具,它能够支持应用程序代码修改后自动重新加载应用程序上下文和服务器。Spring DevTools 可以在项目的 POM 文件中添加依赖来使用,例如:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>
  1. 使用 Spring Loaded:Spring Loaded 是一个 Java 类热替换工具,能够实现类文件的快速重载,避免了反复构建和部署的过程。Spring Boot 也支持与 Spring Loaded 集成,只需要在项目中添加相应的 Spring Loaded 依赖和配置即可。

14.Spring Boot中的监视器是什么?

在Spring Boot中,监视器是指一种用于监控和管理应用程序的工具。Spring Boot提供了许多监视器,包括健康监视器、审计监视器、性能监视器等。

其中,最常用的是健康监视器,它通过检查应用程序的健康状况,可以提供有关应用程序运行状况的信息。健康监视器可以检查应用程序的数据库连接、缓存、消息队列等是否正常运行,并提供有关这些资源的详细信息。

Spring Boot还提供了一个可扩展的监视器框架,允许开发人员编写自定义的监视器。开发人员可以使用该框架来检查应用程序的任何方面,并将结果报告给监视器。

值得一提的是,Spring Boot的监视器是基于Actuator实现的。Actuator是一个Spring Boot子项目,提供了许多监视和管理应用程序的端点。开发人员可以使用Actuator端点来查看应用程序的运行状况、修改配置、执行诊断等操作。

15.Spring Boot 可以兼容老 Spring 项目吗?

Spring Boot可以与老的Spring项目兼容,包括使用XML配置的传统Spring项目。在Spring Boot应用中,可以通过使用@ImportResource注解来加载老的XML配置文件,这样就可以让Spring Boot与传统Spring项目无缝集成。

@ImportResource注解可以用于@Configuration类或@SpringBootApplication类上,它会加载指定的XML配置文件并将其纳入Spring Boot的应用上下文中。例如,以下代码将加载名为applicationContext.xml的XML配置文件:

@Configuration
@ImportResource("classpath:applicationContext.xml")
public class AppConfig {
    // 配置类的代码
}

需要注意的是,虽然可以使用@ImportResource注解来加载XML配置文件,但Spring Boot更推荐使用基于Java的配置方式,即通过Java类来配置应用程序。这种方式更加灵活、类型安全,而且能够很好地利用Spring Boot的自动配置功能。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年12月15日
下一篇 2023年12月15日

相关推荐