SpringBoot常见面试题

  1. 什么是 SpringBoot?它的主要优势是什么?

    答案:SpringBoot 是基于 Spring 框架的快速开发脚手架,旨在简化 Spring 应用的初始搭建和开发过程。其主要优势包括:

    自动配置:通过注解和约定,自动完成大量配置工作,减少 XML 配置;

    起步依赖(Starter):将常用依赖打包,简化依赖管理;

    嵌入式服务器:内置 Tomcat、Jetty 等,无需单独部署;

    生产就绪特性:提供监控、健康检查、外部化配置等功能,便于运维。

  2. SpringBoot 的自动配置原理是什么?

    答案:核心基于@EnableAutoConfiguration注解,该注解通过@Import(AutoConfigurationImportSelector.class)导入自动配置类。AutoConfigurationImportSelector 会扫描META-INF/spring.factories文件,加载其中定义的自动配置类(如DataSourceAutoConfiguration)。这些配置类通过@Conditional条件注解(如@ConditionalOnClass@ConditionalOnMissingBean)判断是否生效,最终根据类路径下的依赖和自定义配置,自动装配 Bean 到 Spring 容器中。

  3. SpringBoot 中的 Starter 是什么?举例说明其作用。

    答案:Starter 是 SpringBoot 提供的一组依赖描述符,将某一功能相关的依赖打包,简化依赖引入。例如spring-boot-starter-web包含了 SpringMVC、Tomcat、Jackson 等 Web 开发所需的核心依赖,开发者只需引入该 Starter,无需手动添加多个依赖,且版本由 SpringBoot 统一管理,避免版本冲突。

  4. 如何自定义 SpringBoot Starter?

    答案:步骤如下:

    ①创建 Maven/Gradle 项目,定义 Starter 名称(通常遵循xxx-spring-boot-starter命名规范);

    ②引入spring-boot-autoconfigurespring-boot-configuration-processor依赖;

    ③编写自动配置类(使用@Configuration@Conditional等注解),定义需要自动装配的 Bean;

    ④在src/main/resources/META-INF/spring.factories中注册自动配置类;

    ⑤打包发布,其他项目引入该 Starter 即可使用自定义功能。

  5. SpringBoot 的核心注解有哪些?各自的作用是什么?

    答案:

    @SpringBootApplication:组合注解,包含@SpringBootConfiguration(标识配置类)、@EnableAutoConfiguration(开启自动配置)、@ComponentScan(扫描组件),是启动类的核心注解;

    @RestController:组合@Controller@ResponseBody,标识控制器类,返回数据直接转为 JSON/XML;

    @RequestMapping/@GetMapping等:映射 HTTP 请求路径和方法;

    @ConfigurationProperties:绑定配置文件中的属性到 Java 类,常用于读取外部配置。

  6. SpringBoot 如何实现外部化配置?有哪些配置方式?

    答案:外部化配置指将配置与代码分离,便于环境切换。常见方式:

    ①配置文件:application.propertiesapplication.yml(支持层级结构),可按环境拆分(如application-dev.yml);

    ②命令行参数:启动时通过--server.port=8080指定配置;

    ③环境变量:读取操作系统环境变量;

    ④配置中心:如 Nacos、Apollo,集中管理配置。通过@Value@ConfigurationProperties注解可将配置注入到 Bean 中。

  7. SpringBoot 中的 profiles 如何使用?

    答案:profiles 用于区分不同环境(如开发、测试、生产)的配置。

    ①在配置文件中通过spring.profiles.active=dev指定激活的环境;

    ②创建环境专属配置文件,如application-dev.yml(开发)、application-prod.yml(生产),仅包含当前环境的特定配置;

    ③在类或方法上使用@Profile("dev"),标识该组件仅在指定环境下生效。启动时可通过命令行--spring.profiles.active=prod动态切换环境。

  8. SpringBoot 集成 Redis 的步骤是什么?

    答案:

    ①引入spring-boot-starter-data-redis依赖;

    ②在application.yml中配置 Redis 连接信息(主机、端口、密码、数据库索引等);

    ③SpringBoot 自动配置RedisTemplateStringRedisTemplate,直接注入即可操作 Redis;

    ④如需自定义序列化方式(如 JSON 序列化),可配置RedisTemplatekeySerializervalueSerializer

  9. SpringBoot 如何实现全局异常处理?

    答案:通过@ControllerAdvice@RestControllerAdvice(适用于 REST 接口)配合@ExceptionHandler注解实现。

    ①创建全局异常处理类,添加@RestControllerAdvice注解;

    ②在方法上使用@ExceptionHandler(异常类型.class)定义异常处理逻辑;

    ③返回统一的响应格式(如包含状态码、消息、数据),简化前端处理。

  10. SpringBoot 与 SpringCloud 的关系是什么?

    答案:SpringBoot 是快速开发单个微服务的框架,提供自动配置、 Starter 等特性,简化 Spring 应用开发;

    SpringCloud 是基于 SpringBoot 的微服务治理框架,专注于微服务间的协同(如服务注册发现、负载均衡、熔断降级、网关路由等)。

    两者的关系是:SpringCloud 依赖 SpringBoot 实现微服务的快速开发,而 SpringBoot 可独立使用(非微服务场景),例如spring-cloud-starter-netflix-eureka-client就是基于 SpringBoot Starter 的微服务组件。