为什么需要掌握 SpringBoot面试题超详细 知识点?
在当今的Java企业级开发中,Spring Boot已经成为事实上的标准框架。无论是初创公司还是大型互联网企业,Spring Boot凭借其“约定优于配置”的理念,极大地简化了Spring应用的初始搭建以及开发过程。因此,在面试中,面试官往往会针对Spring Boot的底层原理、核心特性以及常见应用场景进行深入提问。
本页面旨在为您提供一份SpringBoot面试题超详细的指南,不仅涵盖基础概念,更深入到源码级别的理解,帮助您构建完整的知识体系,从容应对各类技术面试。
Spring Boot 启动流程深度解析
理解Spring Boot的启动流程是掌握其内部机制的关键。面试官常问:“Spring Boot启动时到底做了什么?”
1. 创建 SpringApplication 实例
当我们执行 SpringApplication.run() 时,首先会创建一个 SpringApplication 对象。在这个阶段,会推断应用类型(Servlet、Reactive等),加载应用监听器(ApplicationListeners),并推断主配置类(Primary Source)。
- 推断应用类型:通过检查classpath下是否有特定的类(如DispatcherServlet)来判断是Servlet应用还是响应式应用。
- 加载监听器:从
META-INF/spring.factories文件中加载ApplicationListener的实现类。 - 推断主配置类:找到包含
main方法的类。
2. 准备环境 (Prepare Environment)
这一步主要创建和配置 Environment 对象。它会收集所有的 PropertySource,包括系统属性、命令行参数、application.properties/yml 文件等,并将它们合并到一个统一的环境上下文中。
- 创建
ConfigurableEnvironment。 - 绑定配置参数(如
spring.main.web-application-type)。 - 初始化
ApplicationContextInitializer并调用其initialize方法。
3. 创建上下文 (Create Context)
根据应用类型创建对应的 ApplicationContext(如 AnnotationConfigServletWebServerApplicationContext),并调用 refresh() 方法启动Spring容器。
- 调用
context.refresh(),这是Spring容器初始化的核心。 - 加载所有Bean定义,实例化Bean,处理依赖注入。
- 触发
ApplicationReadyEvent,表示应用启动完成。
Starter 依赖管理机制详解
Spring Boot Starter 是Spring Boot的核心概念之一。它是一种依赖描述符,将相关的依赖打包在一起,方便开发者引入。
什么是 Starter?
Starter 是一个 Maven 或 Gradle 依赖项,您可以将其添加到项目中,以快速添加所需的依赖库和配置。例如,spring-boot-starter-web 会自动引入 Spring MVC、Tomcat 和 Jackson 等依赖。
如何自定义 Starter?
- 创建一个自动配置类,使用
@Configuration和@ConditionalOnClass等注解。 - 在
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中注册自动配置类。 - 提供默认配置属性类,使用
@ConfigurationProperties。
常用 Starter 列表
spring-boot-starter-web:用于构建Web应用,包括RESTful,使用Tomcat作为默认嵌入式容器。spring-boot-starter-data-jpa:用于使用Spring Data JPA和Hibernate。spring-boot-starter-security:用于使用Spring Security进行身份验证和授权。spring-boot-starter-test:用于测试Spring Boot应用,包括JUnit、Mockito等。
自动配置 (Auto-Configuration) 原理
自动配置是Spring Boot“约定优于配置”的核心体现。它允许框架根据classpath下的依赖和已定义的Bean,自动配置Spring应用。
| 注解 | 作用 | 示例 |
|---|---|---|
@ConditionalOnClass |
当classpath下存在指定类时,加载配置 | 如果classpath下有 DispatcherServlet,则加载Web配置 |
@ConditionalOnMissingBean |
当容器中不存在指定Bean时,加载配置 | 如果用户没有自定义 DataSource,则使用默认配置 |
@ConditionalOnProperty |
当配置文件中存在指定属性且值匹配时,加载配置 | 如果 spring.datasource.url 存在,则配置数据源 |
@ConditionalOnWebApplication |
当应用是Web应用时,加载配置 | 仅对Servlet或Reactive Web应用生效 |
自动配置加载流程:
spring-boot-autoconfigure 包中,通过 @EnableAutoConfiguration 注解,Spring Boot会扫描 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件(Spring Boot 2.7+)或 spring.factories 文件(旧版本),获取所有候选的自动配置类。
@Conditional 注解。只有当所有条件都满足时,该配置类才会生效。
@Bean 方法会被执行,将相应的Bean注册到Spring容器中。
Web 开发核心特性
Spring Boot 简化了Web应用的开发,提供了丰富的注解和自动配置功能。
嵌入式容器
Spring Boot 默认内嵌 Tomcat、Jetty 或 Undertow,无需部署WAR包。通过 spring-boot-starter-web 自动引入Tomcat。可以通过 server.port 修改端口号。
全局异常处理
使用 @ControllerAdvice 和 @ExceptionHandler 注解,可以统一处理控制器层抛出的异常,返回统一的JSON格式响应。
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception e) {
return ResponseEntity.status(500).body("服务器内部错误: " + e.getMessage());
}
}
静态资源处理
Spring Boot 默认将 /static, /public, /resources, /META-INF/resources 目录下的文件作为静态资源,可以直接通过URL访问。
数据访问与事务管理
Spring Boot 提供了 spring-boot-starter-data-jpa 和 spring-boot-starter-jdbc 等Starter,简化了数据库访问层的开发。
事务管理 (@Transactional)
- 传播行为: 默认是
REQUIRED,如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新事务。 - 回滚规则: 默认情况下,只有
RuntimeException和Error会触发回滚。可以通过rollbackFor属性指定其他异常类型。 - AOP代理:
@Transactional基于AOP实现,因此自调用(同一类中方法互相调用)时事务不会生效。
JPA 自动配置
当classpath下存在 EntityManagerFactory 时,Spring Boot 会自动配置 DataSource、EntityManagerFactory 和 TransactionManager。可以通过 application.properties 配置数据库连接信息。
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
微服务生态集成
Spring Boot 是 Spring Cloud 的基础。它提供了与 Eureka、Feign、Gateway、Config 等微服务组件的无缝集成。
服务注册与发现
使用 spring-cloud-starter-netflix-eureka-client,可以将Spring Boot应用注册到Eureka Server,实现服务发现。
负载均衡
Spring Cloud LoadBalancer 或 Ribbon 可以与 Feign 或 RestTemplate 结合,实现客户端负载均衡。
配置中心
使用 Spring Cloud Config Server,可以将配置文件集中管理,支持Git、SVN等存储后端,实现配置的动态刷新。
SpringBoot面试题超详细 - 高频问答
Spring 是一个轻量级的Java开发框架,核心是IoC(控制反转)和AOP(面向切面编程)。它需要大量的XML配置或Java配置来管理Bean。
Spring Boot 是基于Spring框架的扩展,旨在简化Spring应用的初始搭建和开发过程。它提供了“约定优于配置”的理念,通过自动配置和Starter依赖,极大地减少了配置工作量。Spring Boot 不是Spring的替代品,而是Spring的加速器和简化器。
可以使用 spring-boot-devtools 模块来实现热部署。在 pom.xml 中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>runtime</scope>
</dependency>
DevTools 会监控classpath下的文件变化,一旦检测到变化,会自动重启应用或重新加载类。它支持Spring Boot的默认配置,无需额外配置。
Spring Boot 支持通过 application-{profile}.properties 或 application-{profile}.yml 文件来管理不同环境的配置。例如,application-dev.yml 用于开发环境,application-prod.yml 用于生产环境。
在 application.yml 中,通过 spring.profiles.active=dev 来激活特定的环境配置。Spring Boot 会优先加载激活环境的配置,未指定的属性则回退到默认配置。
Spring Boot Actuator 是Spring Boot提供的生产就绪特性,它提供了对应用系统的监控和管理功能。通过Actuator,可以查看应用的运行状态、健康检查、指标信息(如JVM内存、HTTP请求统计等)。
常用的端点包括:/actuator/health(健康检查)、/actuator/info(应用信息)、/actuator/metrics(指标信息)等。可以通过 management.endpoints.web.exposure.include= 来暴露所有端点。