欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > Java面试(2025)—— Spring Boot

Java面试(2025)—— Spring Boot

2025/4/26 2:06:00 来源:https://blog.csdn.net/weixin_44356698/article/details/147413153  浏览:    关键词:Java面试(2025)—— Spring Boot

什么是Spring Boot

Spring Boot 是一个约定优于配置的框架,通过自动装配和起步依赖大幅简化了 Spring 应用的搭建。它的核心优势在于:

  1. 快速启动:内嵌服务器和自动配置让开发到部署只需几分钟;
  2. 生态整合:通过 starters 轻松集成 Redis、MQ 等中间件;
  3. 生产就绪:Actuator 提供健康检查、指标监控等能力。

我在XX项目中用 Spring Boot + Docker 实现了微服务快速部署,通过自定义 starter 统一了公司内部的权限验证逻辑,将新服务接入时间从2天缩短到2小时。

常见追问及应对

  1. “Spring Boot 和 Spring Cloud 有什么关系?”
    → “Spring Boot 是单体应用的快速开发框架,Spring Cloud 基于 Boot 构建分布式系统,提供服务发现、配置中心等能力。”
  2. “如何覆盖自动配置?”
    → “通过
    @Bean 显式定义或使用 application.properties 中的 spring.autoconfigure.exclude。”
  3. “Spring Boot 启动过程是怎样的?”
    → “从
    main() 开始,加载 SpringApplication,扫描自动配置类,执行条件装配,最后启动内嵌容器。”

Spring Boot 有哪些优点?

面试回答模板

“Spring Boot的核心优势体现在三个方面:

  1. 开发效率:通过Starters和自动配置,将传统Spring繁琐的XML配置转为‘开箱即用’,比如只需添加一个spring-boot-starter-web依赖即可获得完整的Web开发环境;
  2. 部署便捷:内嵌服务器机制让应用能直接以JAR包运行,结合Docker可实现秒级扩容;
  3. 生产就绪:Actuator提供监控端点,配合Spring Cloud Alibaba可快速构建可观测体系。

常见追问应对

  1. “Spring Boot的缺点?”
    → “自动配置可能带来启动时间较长问题(可通过
    spring.main.lazy-initialization=true优化),且过度封装可能导致新手对底层原理理解不足。”
  2. “如何自定义Starter?”
    → “1) 创建
    autoconfigure模块编写@Configuration类;2) 在META-INF/spring.factories中注册;3) 其他项目通过依赖引入即可自动生效。”
  3. “与Spring MVC的关系?”
    → “Spring Boot是更高层次的封装,其Web模块默认使用Spring MVC,但简化了
    DispatcherServlet等组件的显式配置。”

Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

Spring Boot 核心注解解析

Spring Boot 的核心注解是 @SpringBootApplication,它是一个组合注解(复合注解),主要用于简化Spring Boot应用的启动类配置。

@SpringBootApplication 的组成

@SpringBootApplication 主要由以下三个核心注解组成:

  1. @SpringBootConfiguration
  • 本质上是@Configuration的变体,标识该类为配置类
  • 表示该类是一个Spring Boot的配置类
  1. @EnableAutoConfiguration
  • 启用Spring Boot的自动配置机制
  • 根据类路径中的jar包依赖自动配置Spring应用
  1. @ComponentScan
  • 启用组件扫描,自动发现和注册Bean
  • 默认扫描当前包及其子包中的所有组件

完整等效代码

以下两种写法是等价的:

各组成部分的详细作用

  1. @SpringBootConfiguration
  • 继承自@Configuration
  • 表示该类是Spring应用上下文的配置源
  • 允许通过@Bean注解定义Bean
  1. @EnableAutoConfiguration
  • 启用自动配置的核心机制
  • 根据classpath中的jar依赖自动配置Spring应用
  • 通过META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件加载自动配置类
  1. @ComponentScan
  • 默认扫描当前包及其子包
  • 自动注册@Component, @Service, @Repository, @Controller等注解的类
  • 可通过属性自定义扫描路径:@ComponentScan(basePackages = "com.example")

使用建议

  1. 主类位置:建议将主类放在根包(root package)中,因为@ComponentScan默认扫描主类所在包及其子包
  2. 自定义配置
  1. 排除自动配置

@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自动配置了:

  1. 默认的Hikari数据源
  2. JPA的EntityManagerFactory
  3. 事务管理器
  4. 基础的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中配置:

最佳实践建议

  1. 生产环境:不要使用*作为允许的源,明确指定可信域名
  2. 安全考虑:根据需要使用allowCredentials(注意与allowedOrigins不能同时使用*
  3. 性能优化:设置合理的maxAge减少预检请求
  4. 测试阶段:可以在开发环境临时放宽限制,但上线前务必收紧

常见问题解决

问题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 - 生产环境

激活方式

  1. 配置文件中设置:
  1. 启动参数:
  1. 环境变量:

bootstrap 配置文件(bootstrap.properties / bootstrap.yml)

作用:在应用启动的最早阶段加载,用于配置:

  • Spring Cloud Config Client(从配置中心获取配置)
  • 应用名称(spring.application.name)
  • 加密/解密配置
  • 其他需要在应用上下文引导阶段确定的配置

特点

  • 比application配置文件先加载
  • 主要用于Spring Cloud项目
  • 常规Spring Boot项目通常不需要

示例

配置文件加载顺序

Spring Boot 会按以下顺序加载配置(后加载的覆盖先加载的):

  1. 打包在jar内的bootstrap.yml(或bootstrap.properties)
  2. 打包在jar外的bootstrap.yml(与jar同目录)
  3. 打包在jar内的application.yml
  4. 打包在jar外的application.yml
  5. 环境特定配置(如application-dev.yml
  6. 通过@PropertySource注解指定的自定义属性文件
  7. 默认属性(通过SpringApplication.setDefaultProperties设置)

配置文件的特殊功能

多文档块(YAML特有)

可以在单个YAML文件中使用---分隔符定义多个配置块:

配置占位符

可以在配置中使用${}引用其他配置值:

类型安全配置(@ConfigurationProperties)

将配置文件绑定到Java对象:

对应配置:

外部化配置方式

除了主配置文件,Spring Boot还支持从多种位置加载配置(按优先级从高到低):

  1. 命令行参数(--key=value)
  2. Java系统属性(System.getProperties())
  3. 操作系统环境变量
  4. 打包在jar外的特定profile的配置文件(application-{profile}.properties)
  5. 打包在jar内的特定profile的配置文件
  6. 打包在jar外的application配置文件
  7. 打包在jar内的application配置文件
  8. @Configuration类上的@PropertySource注解
  9. 默认属性(SpringApplication.setDefaultProperties)

最佳实践建议

  1. 环境分离:使用application-{profile}文件管理不同环境配置
  2. 敏感信息:生产环境密码等敏感信息不应直接写在配置文件中,推荐使用:
  • 配置中心(如Spring Cloud Config)
  • 加密配置(使用jasypt-spring-boot)
  • 容器环境变量(如Kubernetes Secrets)
  1. 配置组织
  • 通用配置放在application.yml
  • 环境特定配置放在application-{profile}.yml
  • 微服务配置中心相关配置放在bootstrap.yml
  1. 版本控制:普通配置可以纳入版本控制,敏感配置不应提交

spring Boot常用注解

核心启动注解

  1. @SpringBootApplication
  • 组合注解,包含以下三个核心注解:
  • @SpringBootConfiguration:标记为配置类
  • @EnableAutoConfiguration:启用自动配置
  • @ComponentScan:启用组件扫描
  • 通常用在主启动类上
  1. @EnableAutoConfiguration
  • 启用Spring Boot的自动配置机制
  • 根据类路径中的jar包自动配置Spring应用

Web MVC相关注解

Controller层

  1. @RestController
  • 组合注解,包含@Controller@ResponseBody
  • 表示该类是控制器且所有方法返回值直接写入响应体
  1. @RequestMapping
  • 映射Web请求到处理方法
  • 可指定路径、方法类型等
  1. HTTP方法快捷注解
  • @GetMapping - 等价于@RequestMapping(method = RequestMethod.GET)
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping
  1. @ResponseBody
  • 将方法返回值直接写入HTTP响应体
  1. @RequestBody
  • 将HTTP请求体反序列化为Java对象
  1. @PathVariable
  • 获取URL路径中的变量
  1. @RequestParam
  • 获取请求参数
  1. @RequestHeader
  • 获取请求头信息
  1. @CookieValue
  • 获取Cookie值
  1. @CrossOrigin
  • 处理跨域请求

依赖注入相关

  1. @Component
  • 通用组件注解,标记为Spring管理的Bean
  1. @Service
  • 用于服务层组件
  1. @Repository
  • 用于数据访问层,自动转换数据访问异常
  1. @Controller
  • 用于控制器层
  1. @Autowired
  • 自动注入依赖
  • 新版Spring推荐使用构造器注入代替字段注入
  1. @Qualifier
  • 当有多个同类型Bean时指定具体注入哪个
  1. @Primary
  • 当有多个同类型Bean时,优先使用被标记的Bean
  1. @Value
  • 注入属性值

配置相关注解

  1. @Configuration
  • 声明一个类为配置类
  1. @Bean
  • 声明一个方法的返回值为Bean
  1. @ConfigurationProperties
  • 将配置文件绑定到Java对象
  1. @PropertySource
  • 加载指定的属性文件
  1. @Profile
  • 指定Bean在特定环境下激活

数据访问相关

  1. @Entity
  • JPA实体类注解
  1. @Table
  • 指定实体对应的表名
  1. @Id
  • 指定主键字段
  1. @GeneratedValue
  • 指定主键生成策略
  1. @Column
  • 指定字段与列的映射
  1. @Transactional
  • 声明事务

测试相关

  1. @SpringBootTest
  • 用于Spring Boot集成测试
  1. @Test
  • JUnit测试方法
  1. @MockBean
  • 在测试中模拟Bean
  1. @DataJpaTest
  • 用于JPA仓库测试

定时任务相关

  1. @EnableScheduling
  • 启用定时任务支持
  1. @Scheduled
  • 声明定时任务

缓存相关

  1. @EnableCaching
  • 启用缓存支持
  1. @Cacheable
  • 缓存方法结果
  1. @CacheEvict
  • 清除缓存

异步处理相关

  1. @EnableAsync
  • 启用异步方法执行
  1. @Async
  • 标记方法为异步执行




版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词