springboot 面试题(建议收藏)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
- 《从零手撸:仿小红书(微服务架构)》 已完结,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
前言
在 Java 开发领域,Spring Boot 已成为企业级应用开发的首选框架。随着其生态系统的不断完善,Spring Boot 相关的面试题也逐渐成为 Java 工程师求职的必考内容。无论是刚入行的初级开发者,还是有一定经验的中级工程师,掌握 Spring Boot 的核心概念、常见问题及实战技巧,都是提升面试竞争力的关键。本文将从面试高频考点出发,结合代码示例和实际场景,帮助读者系统梳理 Spring Boot 的核心知识点。
一、Spring Boot 核心概念与原理
1.1 自动配置(Auto-Configuration)
问题示例:Spring Boot 的自动配置是如何实现的?请举例说明。
解答:
Spring Boot 的自动配置通过 @SpringBootApplication
注解中的 @EnableAutoConfiguration
实现。其原理是通过 META-INF/spring.factories
文件中定义的自动配置类,在应用启动时根据类路径中是否存在特定依赖(如 spring-web
、spring-jdbc
等),动态加载对应的配置类。
比喻:
可以将自动配置比作“乐高积木的智能拼接”。例如,当项目中引入了 Spring Web 依赖时,Spring Boot 会自动识别并配置 Tomcat 嵌入服务器、HTTP 请求映射等组件,无需手动编写繁琐的 XML 配置。
代码示例:
// 启动类添加 @SpringBootApplication 注解
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
1.2 启动过程与核心组件
问题示例:Spring Boot 应用的启动流程是怎样的?
解答:
- 加载主类:通过
SpringApplication.run()
方法启动应用。 - 创建应用上下文:根据应用类型(如 Web 应用)选择
AnnotationConfigReactiveWebApplicationContext
或AnnotationConfigServletWebServerApplicationContext
。 - 自动配置:扫描类路径中的
@Configuration
类并加载配置。 - 组件扫描:通过
@ComponentScan
自动发现 Bean。 - 启动 Web 服务器:例如 Tomcat 或 Jetty。
关键类:
| 类名 | 作用 |
|------|------|
| SpringApplication
| 应用启动入口 |
| SpringApplicationBuilder
| 用于复杂配置的构建器模式 |
| ApplicationContext
| 容器的核心接口,管理 Bean 生命周期 |
二、Spring Boot Web 开发与 REST API
2.1 控制器(Controller)与请求映射
问题示例:如何实现一个简单的 RESTful API?
解答:
通过 @RestController
注解定义控制器,并使用 @RequestMapping
或其衍生注解(如 @GetMapping
、@PostMapping
)映射 HTTP 方法。
代码示例:
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping
public List<User> getAllUsers() {
// 逻辑实现
return userService.findAll();
}
@PostMapping
public User createUser(@RequestBody User user) {
return userService.save(user);
}
}
关键点:
@RequestBody
将请求体反序列化为 Java 对象。@PathVariable
可用于从 URL 中提取动态参数(如/api/users/{id}
)。
2.2 异常处理与全局配置
问题示例:如何统一处理全局异常?
解答:
通过 @ControllerAdvice
注解定义全局异常处理器,并使用 @ExceptionHandler
指定要捕获的异常类型。
代码示例:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = {UserNotFoundException.class})
public ResponseEntity<?> handleUserNotFoundException(UserNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body("User not found: " + ex.getMessage());
}
}
三、数据访问与事务管理
3.1 JPA 与 MyBatis 对比
问题示例:Spring Boot 中如何选择 JPA 或 MyBatis?
解答:
- JPA:适合需要快速开发、ORM 映射简单且不需要复杂 SQL 的场景。
- MyBatis:适合需要精细控制 SQL 语句、处理复杂查询或已有大量 SQL 脚本的场景。
JPA 示例:
// 实体类
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// getters and setters
}
// Repository 接口
public interface UserRepository extends JpaRepository<User, Long> {
User findByName(String name);
}
MyBatis 示例:
// Mapper 接口
public interface UserMapper {
@Select("SELECT * FROM users WHERE name = #{name}")
User findByName(@Param("name") String name);
}
3.2 事务管理
问题示例:Spring Boot 中如何声明事务?
解答:
使用 @Transactional
注解标注方法或类。关键属性包括:
propagation
:事务传播行为(如REQUIRED
)。isolation
:事务隔离级别(如READ_COMMITTED
)。rollbackFor
:指定触发回滚的异常类型。
代码示例:
@Service
public class UserService {
@Transactional(rollbackFor = Exception.class)
public void transferMoney(Long fromId, Long toId, BigDecimal amount) {
// 转账逻辑
accountService.debit(fromId, amount);
accountService.credit(toId, amount);
}
}
四、性能优化与常见问题
4.1 Actuator 监控
问题示例:如何监控 Spring Boot 应用的健康状态?
解答:
启用 spring-boot-starter-actuator
依赖后,可通过 /actuator/health
端点查看应用状态。
配置示例:
management.endpoints.web.exposure.include=health,info
4.2 线程池配置
问题示例:如何自定义 Spring Boot 的线程池?
解答:
通过 @Bean
注解定义 ThreadPoolTaskExecutor
并设置核心线程数、队列容量等参数。
代码示例:
@Configuration
public class ThreadConfig {
@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(20);
executor.setQueueCapacity(500);
return executor;
}
}
4.3 常见面试陷阱
- 依赖管理:避免版本冲突(如 Spring Boot 版本与第三方库的兼容性)。
- 日志配置:默认使用 Logback,可通过
logging.level.root=WARN
调整日志级别。 - 资源加载:类路径资源通过
classpath:
前缀加载(如classpath:config/application.properties
)。
五、结论
本文通过系统梳理 Spring Boot 的核心概念、Web 开发、数据访问及性能优化等高频面试考点,结合代码示例和实际场景,帮助读者构建全面的知识体系。掌握这些内容不仅能提升面试表现,更能为实际项目开发打下坚实基础。建议读者在学习过程中多实践、多调试,深入理解框架底层原理,从而在复杂场景中灵活应对。
关键词布局:
- 通过“Spring Boot 面试题”自然贯穿全文,涵盖从基础到高级的考点分析。
- 结合代码示例与场景说明,增强内容的实用性和可读性。
祝你在面试中游刃有余,斩获心仪 Offer!