1. Spring Boot基础
- Q1: Spring Boot是什么?它的优点有哪些?
- Spring Boot是简化Spring应用开发的框架,提供自动配置、内嵌服务器、starter依赖等。优点包括快速搭建、约定优于配置、减少XML配置、集成生态丰富。
- Q2:
@SpringBootApplication
注解的作用是什么?
- 组合了三个核心注解:
@SpringBootConfiguration
(标记为配置类)、@EnableAutoConfiguration
(启用自动配置)、@ComponentScan
(自动扫描组件)。
- Q3: 什么是Spring Boot Starter?举例说明常见Starter。
- Starter是预定义的依赖集合,简化依赖管理。例如:
spring-boot-starter-web
(Web应用)spring-boot-starter-data-jpa
(JPA与数据库)spring-boot-starter-test
(测试)
2. 自动配置与原理
- Q4: Spring Boot自动配置的原理是什么?
- 通过
@EnableAutoConfiguration
触发,扫描META-INF/spring.factories
中的配置类,根据条件注解(如@ConditionalOnClass
)按需加载Bean。
- Q5: 如何排除不必要的自动配置?
- 使用
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
或在application.properties
中设置spring.autoconfigure.exclude
。
- Q6: 条件注解(Conditional Annotations)有哪些?
@ConditionalOnClass
、@ConditionalOnMissingBean
、@ConditionalOnProperty
等,用于控制Bean的创建条件。
3. 配置与属性
- Q7: Spring Boot支持哪些配置文件?优先级如何?
- 支持
application.properties
和application.yml
。优先级从高到低:命令行参数 > 系统环境变量 > 项目内部的配置文件 > 默认配置。
- Q8: 如何读取自定义配置?
- 使用
@Value("${property.key}")
或@ConfigurationProperties
绑定到对象。
- Q9: 什么是Profile?如何切换环境配置?
- Profile用于区分不同环境(如dev、prod)。通过
spring.profiles.active=dev
激活,或命令行--spring.profiles.active=prod
。
4. 核心机制
- Q10: Spring Boot的启动流程是怎样的?
-
- 加载
SpringApplication
;2. 执行run()
方法;3. 读取配置、初始化上下文、执行自动配置、启动内嵌服务器等。
- Q11: 内嵌服务器(如Tomcat)是如何工作的?
- Spring Boot将Tomcat作为依赖打包,启动时通过
ServletWebServerApplicationContext
创建并运行服务器。
- Q12: 如何自定义Spring Boot的Banner?
- 在
src/main/resources
下创建banner.txt
,或通过spring.banner.location
指定文件路径。
5. 数据与持久化
- Q13: 如何集成Spring Data JPA?
- 添加
spring-boot-starter-data-jpa
依赖,配置数据源,定义Repository接口继承JpaRepository
。
- Q14: 什么是Hibernate的N+1查询问题?如何解决?
- 频繁查询关联对象导致多次SQL。解决方案:使用
@EntityGraph
、JPQL的FETCH JOIN
或批量查询。
6. 测试与监控
- Q15: 如何编写Spring Boot单元测试?
- 使用
@SpringBootTest
注解,结合@MockBean
或@DataJpaTest
等切片测试。
- Q16: Spring Boot Actuator的作用是什么?
- 提供生产级监控端点(如
/health
、/metrics
),可通过management.endpoints.web.exposure.include=*
开启。
7. 进阶问题
- Q17: 如何实现Spring Boot应用的优雅停机?
- 配置
server.shutdown=graceful
,并设置超时时间spring.lifecycle.timeout-per-shutdown-phase=30s
。
- Q18: 如何集成Spring Security?
- 添加
spring-boot-starter-security
依赖,通过配置类继承WebSecurityConfigurerAdapter
自定义安全规则。
- Q19: Spring Boot如何支持RESTful服务?
- 使用
@RestController
、@GetMapping
等注解,配合Jackson实现JSON序列化。
8. 实战场景
- Q20: 如何解决跨域请求(CORS)问题?
- 配置
@CrossOrigin
注解或自定义WebMvcConfigurer
添加CORS映射。
- Q21: 如何实现全局异常处理?
- 使用
@ControllerAdvice
和@ExceptionHandler
捕获并统一处理异常。