面试官:SpringBoot 进阶与观测 10 问(第五弹·附图解)
第五篇 · 10 道 SpringBoot 面试题(全新不重复)
- 形式:对话 + 图解 + 大白话
- 场景:架构师深挖环节
- 目标:掌握 SpringBoot 打包、可观测、配置进阶
引言
前四篇刷完,你离"通关"只差最后几步。老王这次把问题聚焦在 打包部署、可观测性与高级配置。准备开冲!
1. Maven spring-boot-maven-plugin
的 repackage
做了什么?
面试官: 为什么执行 mvn package
就能得到可运行 Jar?
候选人: 该插件在生命周期 package
阶段执行 repackage
:
- 把依赖 Jar 复制到
BOOT-INF/lib/
。 - 应用 Class 放
BOOT-INF/classes/
。 - 在 Jar Manifest 里写
Main-Class=org.springframework.boot.loader.JarLauncher
。 - 注入
Spring-Boot-Classes
属性,供 Launcher 解析。
结果形成 Fat Jar,无需外部容器。
2. Layered Jar 是如何加速容器镜像构建的?
候选人: 插件配置 layers
生成 layers.idx
,将 Jar 拆为 dependencies/resources/snapshot-dependencies/application 四层。Docker 只在最上层变化时重新构建,网络传输更快。
3. @ConfigurationPropertiesScan
与 @EnableConfigurationProperties
区别?
面试官: Boot 2.2 之后推荐哪个?
候选人:
@EnableConfigurationProperties
需要显式列出要绑定的类,或放到 Bean 上。@ConfigurationPropertiesScan
会 自动扫描 全包路径下带@ConfigurationProperties
的类,省去了手动注册,更贴近组件化开发。
4. 如何为 @ConfigurationProperties
做参数校验?
候选人: 在属性类上加 @Validated
并使用 Hibernate Validator 注解,例如:
@ConfigurationProperties(prefix = "order")
@Validated
public class OrderProps {
@NotNull
private Duration timeout;
}
启动若缺失 timeout
,Boot 会抛 BindValidationException
,阻止启动,避免线上踩坑。
5. EnvironmentPostProcessor
能做什么?流程图来一张!
候选人: 用来 在 Environment 准备好后、IOC 创建前 注入额外配置源,如远程配置中心、加密解密逻辑。注册方式:在 META-INF/spring.factories
声明。
6. 讲讲 @ConditionalOnClass
与 @ConditionalOnMissingClass
的典型用法?
面试官: 如何根据类路径选择实现?
候选人: 例如 HTTP 客户端自动配置:
@ConditionalOnClass(OkHttpClient.class)
public class OkHttpAutoConfiguration { ... }
@ConditionalOnClass(WebClient.class)
public class WebClientAutoConfiguration { ... }
类在路径上才注入 Bean,避免硬编码依赖。若想兜底,可再来一个 @ConditionalOnMissingClass
自动装配默认实现。
7. Spring AMQP 与 Boot 集成怎么实现自动配置?
候选人: 引入 spring-boot-starter-amqp
,Boot 会:
- 读取
spring.rabbitmq.*
写入CachingConnectionFactory
。 - 创建
RabbitTemplate
单例。 - 提供
SimpleRabbitListenerContainerFactory
供@RabbitListener
使用。
无需 XML,一键搞定消息能力。
8. 解释 Spring Boot Observability
与 OpenTelemetry 的关系?
候选人: Boot 3.2+ 把 Micrometer Tracing + OTel Bridge 打包:
- 默认启用
io.micrometer:micrometer-observation
采样点。 - 加依赖
micrometer-tracing-bridge-otel
即自动输出 TraceId/SpanId 到 OTel Collector,统一链路追踪。
9. 健康检查 Readiness/Liveness
Probe 如何与 Actuator 协同?
面试官: K8s 探针挂哪里?
候选人: 设定:
management:
endpoint:
health:
probes:
enabled: true
Boot 会在 /actuator/health/readiness
/liveness
暴露子结果,探针访问即可区分 暂时不可用 与 彻底挂掉。
10. SpringBoot 可以如何减少启动耗时?
候选人:
- 打开 Lazy Initialization:
spring.main.lazy-initialization=true
。 - 移除不必要的 Starter,关闭
spring.autoconfigure.exclude
。 - 使用 ApplicationContextInitializer 预热缓存。
- 生产上配合 CDS / CRIU + GraalVM Native。
结语
第五弹聚焦打包、配置扫描与观测链路。掌握这些招式,你的 SpringBoot 武器库再升级!