2025年Spring Boot面试题大全(精选120题)
1~20题答案
一、基础概念与核心特性
1. Spring, Spring MVC, Spring Boot的关系是什么?
Spring是一个综合性的框架,提供依赖注入、AOP等核心功能;Spring MVC是Spring的Web模块,用于构建MVC模式的Web应用;Spring Boot基于Spring,通过自动配置和Starter简化开发,支持快速部署和独立运行。
2. Spring Boot的核心特性有哪些?如何简化Spring应用开发?
- 自动配置:根据依赖自动配置应用,减少手动配置。
- Starter:预定义的依赖集合(如
spring-boot-starter-web
),简化依赖管理。 - Actuator:提供监控和管理端点(如
/health
、/metrics
)。 - 外部化配置:支持
application.properties
、application.yml
等配置方式,适配不同环境。 - 内嵌容器:默认集成Tomcat,支持快速部署为可执行JAR。
3. 什么是Spring Boot的“约定大于配置”原则?
通过默认约定(如H2数据库自动配置、端口默认8080)减少手动配置,基于行业最佳实践提升开发效率,同时允许通过覆盖默认配置实现灵活定制。
4. Spring Boot的默认嵌入式服务器是什么?如何切换为Jetty或Undertow?
- 默认嵌入式服务器是Tomcat。
- 切换步骤:
- Maven项目:排除
spring-boot-starter-tomcat
,添加对应依赖(如spring-boot-starter-jetty
)。 - Gradle项目:通过
exclude
和implementation
配置实现切换。
- Maven项目:排除
5. @SpringBootApplication注解的作用是什么?它由哪些注解组合而成?
- 标识Spring Boot应用的入口类,启用自动配置和组件扫描。
- 组合注解:
@Configuration
(声明配置类)、@EnableAutoConfiguration
(启用自动配置)、@ComponentScan
(扫描组件)。
6. Spring Boot的自动配置是如何实现的?其底层机制是什么?
- 通过
@EnableAutoConfiguration
触发,加载META-INF/spring.factories
中的配置类。 - 使用
@Conditional
系列注解按条件配置Bean(如存在某个类时生效)。 - 配置属性通过
@ConfigurationProperties
绑定,支持外部化配置。
7. 什么是Spring Boot Starter?列举常用的Starter并说明其作用。
- Starter是预定义的依赖集合,简化依赖管理。
- 常用Starter:
spring-boot-starter-web
:构建Web应用(含Tomcat和Spring MVC)。spring-boot-starter-data-jpa
:集成JPA实现数据持久化。spring-boot-starter-security
:实现安全控制。spring-boot-starter-test
:集成测试框架(如JUnit、Mockito)。
8. Spring Boot如何支持微服务架构?与Spring Cloud的关系是什么?
- Spring Boot简化微服务开发,Spring Cloud提供服务治理(如Eureka服务注册、Ribbon负载均衡)。
- Spring Cloud基于Spring Boot,二者相辅相成:Spring Boot负责快速开发,Spring Cloud解决分布式系统挑战。
9. Spring Boot Actuator的作用是什么?列举常用的Actuator端点。
- 提供监控和管理功能,常用端点:
/health
:检查应用健康状态。/metrics
:获取JVM内存、HTTP请求统计等指标。/env
:查看环境变量和配置属性。/loggers
:动态修改日志级别。
10. Spring Boot内嵌容器的优势是什么?如何自定义容器配置?
- **优势**:独立运行,无需外部服务器,简化部署。
- **自定义配置**:
- 通过`application.properties`调整端口、线程池等参数(如`server.port=8080`)。
- 高级调优:自定义配置类(如调整Tomcat连接数、超时时间)。
二、配置与依赖管理
11. Spring Boot支持哪些配置文件格式?application.properties与application.yml的区别是什么?
- 支持`.properties`和`.yml`格式。
- `.yml`通过层级结构提升可读性,适合复杂配置;`.properties`键值对简单直观。
12. 如何通过配置文件设置不同环境的参数(如开发、生产环境)?
- 使用`application-{profile}.properties`(如`application-dev.properties`)。
- 激活Profile:通过`spring.profiles.active=dev`指定环境。
13. @ConfigurationProperties注解的作用是什么?如何与配置文件绑定?
- 将配置文件属性绑定到Java类,支持类型安全配置。
- 示例:`@ConfigurationProperties(prefix = "spring.datasource")`绑定数据源配置。
14. 如何解决配置文件中的属性覆盖问题?
- 使用`@Primary`注解标记优先Bean。
- 通过`spring.config.location`指定外部配置文件路径,覆盖默认配置。
15. Spring Boot如何管理第三方库的依赖?Maven与Gradle的配置差异是什么?
- 通过Starter管理常用依赖,Maven使用`pom.xml`,Gradle使用`build.gradle`。
- Maven依赖管理更成熟,Gradle脚本更简洁、构建速度更快。
16. 如何排除自动配置中的某个类?
- 使用`@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})`排除特定自动配置类。
17. Spring Boot多模块项目中如何共享配置?
- 将公共配置提取到独立模块,通过`@ImportResource`或`@Configuration`导入。
18. 如何通过命令行参数覆盖配置文件中的属性?
- 启动时添加`--key=value`参数(如`java -jar app.jar --server.port=9090`)。
19. Spring Boot如何集成外部配置中心(如Spring Cloud Config)?
- 添加`spring-cloud-starter-config`依赖,配置中心化配置仓库(如Git),通过`@RefreshScope`动态刷新配置。
20. @Profile注解的作用是什么?如何结合配置文件使用?
- 根据环境激活不同Bean或配置。
- 示例:`@Profile("dev")`仅在开发环境生效,结合`application-dev.properties`使用。
21~40题答案
三、数据访问与持久化
21. Spring Boot中如何配置多数据源?
- 步骤:
- 定义多个
DataSource
Bean,使用@Qualifier
区分。 - 配置多个
JdbcTemplate
或JpaTransactionManager
,绑定对应数据源。 - 通过
@Primary
标记默认数据源,避免冲突。
- 定义多个
- 示例:
@Bean @ConfigurationProperties(prefix = "spring.datasource.db1") public DataSource dataSource1() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.db2") public DataSource dataSource2() { return DataSourceBuilder.create().build(); }
22. JPA与MyBatis在Spring Boot中的集成方式有何不同?
- JPA:通过
spring-boot-starter-data-jpa
自动配置,使用JpaRepository
接口,支持面向对象的查询(如findByName
)。 - MyBatis:需手动配置
SqlSessionFactory
和Mapper接口,通过XML或注解编写SQL,灵活性更高。
23. 如何通过@Transactional注解管理事务?其传播行为与隔离级别如何配置?
- 传播行为:
@Transactional(propagation = Propagation.REQUIRED)
(默认,加入当前事务)。 - 隔离级别:
@Transactional(isolation = Isolation.READ_COMMITTED)
。 - 超时与回滚:
timeout = 30
(秒),rollbackFor = Exception.class
。
24. Spring Data JPA的核心接口有哪些?如何实现自定义查询?
- 核心接口:
CrudRepository
(基础CRUD)、PagingAndSortingRepository
(分页排序)、JpaRepository
(JPA扩展)。 - 自定义查询:
- 方法名解析:
findByEmailAndActive(String email, boolean active)
。 @Query
注解:编写JPQL或原生SQL。
- 方法名解析:
25. 如何解决数据库连接池的配置问题(如HikariCP)?
- 配置参数:
spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.connection-timeout=30000
- 监控:通过Actuator的
/metrics
端点查看连接池状态。
26. Spring Boot中如何实现分布式事务?
- 方案:
- 使用Seata框架,通过
@GlobalTransactional
注解标记全局事务。 - 集成JTA(如Atomikos),但复杂度较高。
- 使用Seata框架,通过
27. 如何配置JPA的审计功能(如创建时间、更新时间自动填充)?
- 步骤:
- 实体类添加
@CreatedDate
、@LastModifiedDate
注解。 - 启用
@EnableJpaAuditing
,配置审计Bean。
- 实体类添加
- 示例:
@Entity @EntityListeners(AuditingEntityListener.class) public class User { @CreatedDate private LocalDateTime createTime; }
28. Spring Boot如何集成MongoDB或Redis等NoSQL数据库?
- MongoDB:添加
spring-boot-starter-data-mongodb
依赖,配置spring.data.mongodb.uri
。 - Redis:添加
spring-boot-starter-data-redis
依赖,配置spring.redis.host
和spring.redis.port
,使用StringRedisTemplate
或RedisTemplate
操作数据。
29. 如何通过JdbcTemplate执行原生SQL查询?
- 步骤:
- 自动注入
JdbcTemplate
。 - 使用
queryForObject
、update
等方法执行SQL。
- 自动注入
- 示例:
@Autowired private JdbcTemplate jdbcTemplate; public User getUser(Long id) { String sql = "SELECT * FROM user WHERE id = ?"; return jdbcTemplate.queryForObject(sql, new Object[]{ id}, (rs, rowNum) -> { User user = new User(); user.setId(rs.getLong("id")); user.setName(rs.getString("name")); return user; }); }
30. Spring Batch在Spring Boot中的应用场景是什么?
- 场景:批量处理数据(如ETL、报表生成),支持任务分片、重启、事务管理。
- 配置:通过
@EnableBatchProcessing
启用,定义Job
和Step
。
四、Web开发与RESTful API
31. Spring Boot中如何创建一个RESTful控制器?
- 步骤:
- 使用
@RestController
注解类。 - 通过
@RequestMapping
或@GetMapping
等注解定义API路径。
- 使用
- 示例:
@RestController @RequestMapping("/api/users") public class UserController { @GetMapping("/{id}"