什么是Spring Boot
Spring Boot 是一个约定优于配置的框架,通过自动装配和起步依赖大幅简化了 Spring 应用的搭建。它的核心优势在于:
- 快速启动:内嵌服务器和自动配置让开发到部署只需几分钟;
- 生态整合:通过 starters 轻松集成 Redis、MQ 等中间件;
- 生产就绪:Actuator 提供健康检查、指标监控等能力。
我在XX项目中用 Spring Boot + Docker 实现了微服务快速部署,通过自定义 starter 统一了公司内部的权限验证逻辑,将新服务接入时间从2天缩短到2小时。
常见追问及应对
- “Spring Boot 和 Spring Cloud 有什么关系?”
→ “Spring Boot 是单体应用的快速开发框架,Spring Cloud 基于 Boot 构建分布式系统,提供服务发现、配置中心等能力。” - “如何覆盖自动配置?”
→ “通过@Bean
显式定义或使用application.properties
中的spring.autoconfigure.exclude
。” - “Spring Boot 启动过程是怎样的?”
→ “从main()
开始,加载SpringApplication
,扫描自动配置类,执行条件装配,最后启动内嵌容器。”
Spring Boot 有哪些优点?
面试回答模板
“Spring Boot的核心优势体现在三个方面:
- 开发效率:通过Starters和自动配置,将传统Spring繁琐的XML配置转为‘开箱即用’,比如只需添加一个
spring-boot-starter-web
依赖即可获得完整的Web开发环境; - 部署便捷:内嵌服务器机制让应用能直接以JAR包运行,结合Docker可实现秒级扩容;
- 生产就绪:Actuator提供监控端点,配合Spring Cloud Alibaba可快速构建可观测体系。
常见追问应对
- “Spring Boot的缺点?”
→ “自动配置可能带来启动时间较长问题(可通过spring.main.lazy-initialization=true
优化),且过度封装可能导致新手对底层原理理解不足。” - “如何自定义Starter?”
→ “1) 创建autoconfigure
模块编写@Configuration
类;2) 在META-INF/spring.factories
中注册;3) 其他项目通过依赖引入即可自动生效。” - “与Spring MVC的关系?”
→ “Spring Boot是更高层次的封装,其Web模块默认使用Spring MVC,但简化了DispatcherServlet
等组件的显式配置。”
Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
Spring Boot 核心注解解析
Spring Boot 的核心注解是 @SpringBootApplication
,它是一个组合注解(复合注解),主要用于简化Spring Boot应用的启动类配置。
@SpringBootApplication
的组成
@SpringBootApplication
主要由以下三个核心注解组成:
@SpringBootConfiguration
- 本质上是
@Configuration
的变体,标识该类为配置类 - 表示该类是一个Spring Boot的配置类
@EnableAutoConfiguration
- 启用Spring Boot的自动配置机制
- 根据类路径中的jar包依赖自动配置Spring应用
@ComponentScan
- 启用组件扫描,自动发现和注册Bean
- 默认扫描当前包及其子包中的所有组件
完整等效代码
以下两种写法是等价的:
各组成部分的详细作用
@SpringBootConfiguration
- 继承自
@Configuration
- 表示该类是Spring应用上下文的配置源
- 允许通过
@Bean
注解定义Bean
@EnableAutoConfiguration
- 启用自动配置的核心机制
- 根据classpath中的jar依赖自动配置Spring应用
- 通过
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件加载自动配置类
@ComponentScan
- 默认扫描当前包及其子包
- 自动注册
@Component
,@Service
,@Repository
,@Controller
等注解的类 - 可通过属性自定义扫描路径:
@ComponentScan(basePackages = "com.example")
使用建议
- 主类位置:建议将主类放在根包(root package)中,因为
@ComponentScan
默认扫描主类所在包及其子包 - 自定义配置:
- 排除自动配置:
@SpringBootApplication
这种组合注解的设计体现了Spring Boot"约定优于配置"的理念,极大简化了Spring应用的初始配置。
Spring Boot 自动配置原理是什么?
简明扼要的开场(总)
"Spring Boot自动配置是其核心特性之一,它通过约定优于配置的理念,根据应用所处的环境智能地配置Spring应用。简单来说,当我们在类路径下添加特定依赖时,Spring Boot会自动配置相关的Bean,大幅减少了手动配置的工作量。"
分层解析关键点(分)
触发机制
"自动配置的核心是通过@EnableAutoConfiguration
注解触发的。Spring Boot启动时会扫描所有jar包中的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件(旧版本是spring.factories),加载其中声明的自动配置类。"
条件过滤
"这些自动配置类不会全部生效,而是通过一系列@Conditional
条件注解进行过滤,例如:
@ConditionalOnClass
:当类路径存在指定类时生效@ConditionalOnMissingBean
:当容器中不存在指定Bean时生效@ConditionalOnProperty
:当配置属性满足条件时生效
这种机制确保了只加载当前应用真正需要的自动配置。"
配置过程
"以数据源配置为例,当检测到类路径下有HikariCP连接池相关类,且用户没有自定义DataSource Bean时,Spring Boot就会自动配置一个优化过的Hikari数据源,并可以通过application.properties中的spring.datasource
前缀属性进行微调。"
执行顺序
"自动配置的执行顺序可以通过@AutoConfigureBefore
和@AutoConfigureAfter
控制,确保依赖关系正确的配置类按正确顺序加载。"
结合实际经验(加分项)
"在我最近的项目中,我们使用了Spring Data JPA。当我添加了spring-boot-starter-data-jpa
依赖后,Spring Boot自动配置了:
- 默认的Hikari数据源
- JPA的EntityManagerFactory
- 事务管理器
- 基础的JPA配置
当我们需要覆盖默认配置时,只需要在配置类中定义自己的Bean即可,比如我们自定义了数据源连接池参数。"
4. 总结升华(总)
"Spring Boot自动配置的本质是通过条件判断机制,智能地组合各种@Configuration
类。它完美体现了约定优于配置的思想,既保持了Spring框架的灵活性,又大幅简化了配置工作。理解这个原理对我们正确使用和自定义Starter非常重要。"
可能的追问及应对
面试官可能会追问:
- "如何查看当前生效的自动配置?"
→ "可以通过在启动时添加--debug
参数,或在application.properties中设置debug=true
,Spring Boot会打印出所有条件评估报告。" - "如何自定义一个Starter?"
→ "需要创建自动配置模块和starter模块,通过@ConfigurationProperties
绑定配置,使用条件注解控制生效条件,最后在META-INF/spring/下声明自动配置类。" - "自动配置和显式配置的优先级?"
→ "显式配置优先,当用户通过@Bean
明确定义Bean后,相关的自动配置会跳过,这是通过@ConditionalOnMissingBean
实现的。"
Spring Boot 中如何解决跨域问题 ?
使用 @CrossOrigin
注解(方法级/类级控制)
这是最简单的解决方案,适合细粒度控制:
可配置参数:
origins
:允许的源列表methods
:允许的HTTP方法allowedHeaders
:允许的请求头exposedHeaders
:暴露给浏览器的响应头maxAge
:预检请求缓存时间(秒)
全局CORS配置(推荐)
通过配置类实现全局CORS配置,适合统一管理:
过滤器(Filter)方式
适用于需要更底层控制的场景:
Spring Security 集成方案
如果项目使用了Spring Security,需要额外配置:
配置属性方式(Spring Boot 2.4+)
在application.properties/yml中配置:
最佳实践建议
- 生产环境:不要使用
*
作为允许的源,明确指定可信域名 - 安全考虑:根据需要使用
allowCredentials
(注意与allowedOrigins
不能同时使用*
) - 性能优化:设置合理的
maxAge
减少预检请求 - 测试阶段:可以在开发环境临时放宽限制,但上线前务必收紧
常见问题解决
问题1:配置了CORS但仍然出现跨域错误
- 检查浏览器控制台错误信息
- 确保没有多个CORS配置相互覆盖
- 检查是否有安全框架(如Spring Security)需要额外配置
问题2:OPTIONS请求返回403
- 在Spring Security中确保放行OPTIONS方法
- 或在过滤器中正确处理OPTIONS请求
问题3:带Cookie的请求失败
- 确保配置了
allowCredentials(true)
- 前端请求需要设置
withCredentials: true
- 不能同时使用
allowedOrigins("*")
和allowCredentials(true)
根据项目实际需求选择合适的解决方案,对于大多数应用,推荐使用第2种全局配置方式。
springBoot的核心配置文件有哪些,作用是什么?
主配置文件(application.properties / application.yml)
作用:Spring Boot 应用的主要配置入口,包含应用的所有自定义配置。
特点:
- 支持两种格式:
.properties
(键值对)和.yml
(层次结构) - 默认位于
src/main/resources
目录下 - 按优先级合并所有找到的配置文件
示例:
或等价的YAML格式:
环境特定配置文件(application-{profile}.properties/yml)
作用:为不同环境(如开发、测试、生产)提供特定配置。
命名规则:
application-dev.properties
- 开发环境application-test.properties
- 测试环境application-prod.properties
- 生产环境
激活方式:
- 配置文件中设置:
- 启动参数:
- 环境变量:
bootstrap 配置文件(bootstrap.properties / bootstrap.yml)
作用:在应用启动的最早阶段加载,用于配置:
- Spring Cloud Config Client(从配置中心获取配置)
- 应用名称(spring.application.name)
- 加密/解密配置
- 其他需要在应用上下文引导阶段确定的配置
特点:
- 比application配置文件先加载
- 主要用于Spring Cloud项目
- 常规Spring Boot项目通常不需要
示例:
配置文件加载顺序
Spring Boot 会按以下顺序加载配置(后加载的覆盖先加载的):
- 打包在jar内的
bootstrap.yml
(或bootstrap.properties) - 打包在jar外的
bootstrap.yml
(与jar同目录) - 打包在jar内的
application.yml
- 打包在jar外的
application.yml
- 环境特定配置(如
application-dev.yml
) - 通过
@PropertySource
注解指定的自定义属性文件 - 默认属性(通过
SpringApplication.setDefaultProperties
设置)
配置文件的特殊功能
多文档块(YAML特有)
可以在单个YAML文件中使用---
分隔符定义多个配置块:
配置占位符
可以在配置中使用${}
引用其他配置值:
类型安全配置(@ConfigurationProperties)
将配置文件绑定到Java对象:
对应配置:
外部化配置方式
除了主配置文件,Spring Boot还支持从多种位置加载配置(按优先级从高到低):
- 命令行参数(--key=value)
- Java系统属性(System.getProperties())
- 操作系统环境变量
- 打包在jar外的特定profile的配置文件(application-{profile}.properties)
- 打包在jar内的特定profile的配置文件
- 打包在jar外的application配置文件
- 打包在jar内的application配置文件
- @Configuration类上的@PropertySource注解
- 默认属性(SpringApplication.setDefaultProperties)
最佳实践建议
- 环境分离:使用
application-{profile}
文件管理不同环境配置 - 敏感信息:生产环境密码等敏感信息不应直接写在配置文件中,推荐使用:
- 配置中心(如Spring Cloud Config)
- 加密配置(使用jasypt-spring-boot)
- 容器环境变量(如Kubernetes Secrets)
- 配置组织:
- 通用配置放在application.yml
- 环境特定配置放在application-{profile}.yml
- 微服务配置中心相关配置放在bootstrap.yml
- 版本控制:普通配置可以纳入版本控制,敏感配置不应提交
spring Boot常用注解
核心启动注解
@SpringBootApplication
- 组合注解,包含以下三个核心注解:
@SpringBootConfiguration
:标记为配置类@EnableAutoConfiguration
:启用自动配置@ComponentScan
:启用组件扫描
- 通常用在主启动类上
@EnableAutoConfiguration
- 启用Spring Boot的自动配置机制
- 根据类路径中的jar包自动配置Spring应用
Web MVC相关注解
Controller层
@RestController
- 组合注解,包含
@Controller
和@ResponseBody
- 表示该类是控制器且所有方法返回值直接写入响应体
@RequestMapping
- 映射Web请求到处理方法
- 可指定路径、方法类型等
- HTTP方法快捷注解
@GetMapping
- 等价于@RequestMapping(method = RequestMethod.GET)
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@ResponseBody
- 将方法返回值直接写入HTTP响应体
@RequestBody
- 将HTTP请求体反序列化为Java对象
@PathVariable
- 获取URL路径中的变量
@RequestParam
- 获取请求参数
@RequestHeader
- 获取请求头信息
@CookieValue
- 获取Cookie值
@CrossOrigin
- 处理跨域请求
依赖注入相关
@Component
- 通用组件注解,标记为Spring管理的Bean
@Service
- 用于服务层组件
@Repository
- 用于数据访问层,自动转换数据访问异常
@Controller
- 用于控制器层
@Autowired
- 自动注入依赖
- 新版Spring推荐使用构造器注入代替字段注入
@Qualifier
- 当有多个同类型Bean时指定具体注入哪个
@Primary
- 当有多个同类型Bean时,优先使用被标记的Bean
@Value
- 注入属性值
配置相关注解
@Configuration
- 声明一个类为配置类
@Bean
- 声明一个方法的返回值为Bean
@ConfigurationProperties
- 将配置文件绑定到Java对象
@PropertySource
- 加载指定的属性文件
@Profile
- 指定Bean在特定环境下激活
数据访问相关
@Entity
- JPA实体类注解
@Table
- 指定实体对应的表名
@Id
- 指定主键字段
@GeneratedValue
- 指定主键生成策略
@Column
- 指定字段与列的映射
@Transactional
- 声明事务
测试相关
@SpringBootTest
- 用于Spring Boot集成测试
@Test
- JUnit测试方法
@MockBean
- 在测试中模拟Bean
@DataJpaTest
- 用于JPA仓库测试
定时任务相关
@EnableScheduling
- 启用定时任务支持
@Scheduled
- 声明定时任务
缓存相关
@EnableCaching
- 启用缓存支持
@Cacheable
- 缓存方法结果
@CacheEvict
- 清除缓存
异步处理相关
@EnableAsync
- 启用异步方法执行
@Async
- 标记方法为异步执行