SpringBoot常见面试题
-
什么是 SpringBoot?它的主要优势是什么?
答案:SpringBoot 是基于 Spring 框架的快速开发脚手架,旨在简化 Spring 应用的初始搭建和开发过程。其主要优势包括:
①自动配置:通过注解和约定,自动完成大量配置工作,减少 XML 配置;
②起步依赖(Starter):将常用依赖打包,简化依赖管理;
③嵌入式服务器:内置 Tomcat、Jetty 等,无需单独部署;
④生产就绪特性:提供监控、健康检查、外部化配置等功能,便于运维。
-
SpringBoot 的自动配置原理是什么?
答案:核心基于
@EnableAutoConfiguration
注解,该注解通过@Import(AutoConfigurationImportSelector.class)
导入自动配置类。AutoConfigurationImportSelector 会扫描META-INF/spring.factories
文件,加载其中定义的自动配置类(如DataSourceAutoConfiguration
)。这些配置类通过@Conditional
条件注解(如@ConditionalOnClass
、@ConditionalOnMissingBean
)判断是否生效,最终根据类路径下的依赖和自定义配置,自动装配 Bean 到 Spring 容器中。 -
SpringBoot 中的 Starter 是什么?举例说明其作用。
答案:Starter 是 SpringBoot 提供的一组依赖描述符,将某一功能相关的依赖打包,简化依赖引入。例如
spring-boot-starter-web
包含了 SpringMVC、Tomcat、Jackson 等 Web 开发所需的核心依赖,开发者只需引入该 Starter,无需手动添加多个依赖,且版本由 SpringBoot 统一管理,避免版本冲突。 -
如何自定义 SpringBoot Starter?
答案:步骤如下:
①创建 Maven/Gradle 项目,定义 Starter 名称(通常遵循
xxx-spring-boot-starter
命名规范);②引入
spring-boot-autoconfigure
和spring-boot-configuration-processor
依赖;③编写自动配置类(使用
@Configuration
、@Conditional
等注解),定义需要自动装配的 Bean;④在
src/main/resources/META-INF/spring.factories
中注册自动配置类;⑤打包发布,其他项目引入该 Starter 即可使用自定义功能。
-
SpringBoot 的核心注解有哪些?各自的作用是什么?
答案:
①
@SpringBootApplication
:组合注解,包含@SpringBootConfiguration
(标识配置类)、@EnableAutoConfiguration
(开启自动配置)、@ComponentScan
(扫描组件),是启动类的核心注解;②
@RestController
:组合@Controller
和@ResponseBody
,标识控制器类,返回数据直接转为 JSON/XML;③
@RequestMapping
/@GetMapping
等:映射 HTTP 请求路径和方法;④
@ConfigurationProperties
:绑定配置文件中的属性到 Java 类,常用于读取外部配置。 -
SpringBoot 如何实现外部化配置?有哪些配置方式?
答案:外部化配置指将配置与代码分离,便于环境切换。常见方式:
①配置文件:
application.properties
、application.yml
(支持层级结构),可按环境拆分(如application-dev.yml
);②命令行参数:启动时通过
--server.port=8080
指定配置;③环境变量:读取操作系统环境变量;
④配置中心:如 Nacos、Apollo,集中管理配置。通过
@Value
或@ConfigurationProperties
注解可将配置注入到 Bean 中。 -
SpringBoot 中的 profiles 如何使用?
答案:profiles 用于区分不同环境(如开发、测试、生产)的配置。
①在配置文件中通过
spring.profiles.active=dev
指定激活的环境;②创建环境专属配置文件,如
application-dev.yml
(开发)、application-prod.yml
(生产),仅包含当前环境的特定配置;③在类或方法上使用
@Profile("dev")
,标识该组件仅在指定环境下生效。启动时可通过命令行--spring.profiles.active=prod
动态切换环境。 -
SpringBoot 集成 Redis 的步骤是什么?
答案:
①引入
spring-boot-starter-data-redis
依赖;②在
application.yml
中配置 Redis 连接信息(主机、端口、密码、数据库索引等);③SpringBoot 自动配置
RedisTemplate
和StringRedisTemplate
,直接注入即可操作 Redis;④如需自定义序列化方式(如 JSON 序列化),可配置
RedisTemplate
的keySerializer
和valueSerializer
。 -
SpringBoot 如何实现全局异常处理?
答案:通过
@ControllerAdvice
或@RestControllerAdvice
(适用于 REST 接口)配合@ExceptionHandler
注解实现。①创建全局异常处理类,添加
@RestControllerAdvice
注解;②在方法上使用
@ExceptionHandler(异常类型.class)
定义异常处理逻辑;③返回统一的响应格式(如包含状态码、消息、数据),简化前端处理。
-
SpringBoot 与 SpringCloud 的关系是什么?
答案:SpringBoot 是快速开发单个微服务的框架,提供自动配置、 Starter 等特性,简化 Spring 应用开发;
SpringCloud 是基于 SpringBoot 的微服务治理框架,专注于微服务间的协同(如服务注册发现、负载均衡、熔断降级、网关路由等)。
两者的关系是:SpringCloud 依赖 SpringBoot 实现微服务的快速开发,而 SpringBoot 可独立使用(非微服务场景),例如
spring-cloud-starter-netflix-eureka-client
就是基于 SpringBoot Starter 的微服务组件。