第五篇:面试官:SpringBoot 进阶与观测 10 问(第五弹·附图解)

面试官:SpringBoot 进阶与观测 10 问(第五弹·附图解)

第五篇 · 10 道 SpringBoot 面试题(全新不重复)

  • 形式:对话 + 图解 + 大白话
  • 场景:架构师深挖环节
  • 目标:掌握 SpringBoot 打包、可观测、配置进阶

引言

前四篇刷完,你离"通关"只差最后几步。老王这次把问题聚焦在 打包部署、可观测性与高级配置。准备开冲!


1. Maven spring-boot-maven-pluginrepackage 做了什么?

面试官: 为什么执行 mvn package 就能得到可运行 Jar?

候选人: 该插件在生命周期 package 阶段执行 repackage

  1. 把依赖 Jar 复制到 BOOT-INF/lib/
  2. 应用 Class 放 BOOT-INF/classes/
  3. 在 Jar Manifest 里写 Main-Class=org.springframework.boot.loader.JarLauncher
  4. 注入 Spring-Boot-Classes 属性,供 Launcher 解析。

结果形成 Fat Jar,无需外部容器。


2. Layered Jar 是如何加速容器镜像构建的?

变化少
偶尔变
经常变
依赖层
Image
资源层
应用类层

候选人: 插件配置 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 能做什么?流程图来一张!

SpringApplication EnvironmentPostProcessor Context postProcessEnvironment() 追加/修改 PropertySource refresh() SpringApplication EnvironmentPostProcessor Context

候选人: 用来 在 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 集成怎么实现自动配置?

AutoConfig
ConnectionFactory
RabbitTemplate
ListenerContainerFactory

候选人: 引入 spring-boot-starter-amqp,Boot 会:

  1. 读取 spring.rabbitmq.* 写入 CachingConnectionFactory
  2. 创建 RabbitTemplate 单例。
  3. 提供 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 可以如何减少启动耗时?

候选人:

  1. 打开 Lazy Initializationspring.main.lazy-initialization=true
  2. 移除不必要的 Starter,关闭 spring.autoconfigure.exclude
  3. 使用 ApplicationContextInitializer 预热缓存。
  4. 生产上配合 CDS / CRIU + GraalVM Native

结语

第五弹聚焦打包、配置扫描与观测链路。掌握这些招式,你的 SpringBoot 武器库再升级!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值