金三银四刚过,秋招提前批又悄悄启动了,这段时间我在后台收到最多的私信基本都长这样:Spring Boot的自动配置到底怎么跟面试官讲清楚?微服务拆分到什么粒度才算有章法?Redis分布式锁明明背得好好的,一到手写就绷不住?说实话,这类问题背后反映的不是你背得不够多,而是没有把答案组织成面试官真正想听的逻辑。
这篇文章我结合自己在互联网大厂做技术面试官的经历,以及带过的求职者反复被问到的真题,把Spring Boot、微服务、Redis这几个核心方向串起来做一次“场景式问答拆解”。不看那种单纯罗列答案的面经,而是把每一类题目背后的考察意图和回答路径讲透——适合准备大厂Java后端岗位的候选人,也适合工作两三年的朋友查漏补缺。
1. Spring Boot方向:从自动配置到生产监控,问题往往是连环的
1.1 自动配置的底层逻辑,一句话能说清吗
Spring Boot面试题里出场率最高的就是自动配置。很多人能说出@SpringBootApplication、@EnableAutoConfiguration,但被追问到“具体是怎么把RedisTemplate这种Bean装配进来的”就卡住了。
我建议你把回答拆成三层。第一层是入口注解,@SpringBootApplication其实组合了@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan。第二层是自动配置的加载机制,关键在于AutoConfigurationImportSelector,它会读取依赖jar包下META-INF目录里的自动配置文件,Spring Boot 2.7以前读取spring.factories,2.7以后改为读取AutoConfiguration.imports。第三层是条件装配,像RedisAutoConfiguration这个类上面标了@ConditionalOnClass(RedisOperations.class),只有当classpath下面存在对应类时,这组配置才生效,后面的@ConditionalOnMissingBean注解又保证了,只要你自己定义了RedisTemplate,自动配置的默认模板就会退让。
面试官一般会顺势追问:如果某个自动配置你不想要怎么办?官方做法是用exclude属性排除,比如@SpringBootApplication(exclude = RedisAutoConfiguration.class);也可以用spring.autoconfigure.exclude配置项。这里有个容易被忽略的点:排除条件装配的时候最好写清楚要排除的配置类,而不是把整个自动配置功能关掉,否则会影响其他依赖。
自定义starter可能也是下一问。核心就是两步:写一个@Configuration配置类,里面通过@Bean装配好要给调用方使用的东西,再加一个AutoConfiguration.imports文件指向这个配置类。要注意的是,自动配置类不要放在被扫描的顶层包目录下,否则会被普通@ComponentScan提前扫到,导致条件注解失效,正确的做法是放在独立的包路径里。
1.2 从监控到消息队列:Spring Boot里的生产级实战问法
Actuator和Micrometer最近在大厂面试中明显变多了。原因很简单,现在招人不是让你写个CRUD Demo,而是希望你理解线上可观测性。Actuator负责把应用的运行状态暴露出来,提供health、metrics、threaddump等HTTP端点;Micrometer则是一个门面式的指标采集库,支持把JVM信息、HTTP请求耗时、Redis连接池状态统一成标准格式,再输出到Prometheus、Datadog或者InfluxDB这类监控系统。
回答这类问题可以按“三步采集链路”来讲:应用先通过Micrometer的MeterRegistry注册指标,Actuator把指标暴露成端点,监控平台定时拉取后再做告警和展示。如果被问到“生产环境健康检查只显示UP够不够”,可以补一句:单独靠Actuator的health是不够的,建议自定义HealthIndicator对核心依赖做探测,比如检测Redis连通性、消息队列堆积数、数据库连接池空闲率,这样一旦下游出问题,服务能尽早反馈到体检中心,而不是等调用方超时才被动发现。
再来看一个高频实操题:如何使用Maven构建Spring Boot项目并在本地跑起来。标准命令链是mvn clean package或者直接mvn spring-boot:run,但面试官真正想看的是你对构建生命周期的熟悉度。你最好能说清楚package阶段会将应用打成可执行jar,而spring-boot-maven-plugin在打包时会把依赖和启动器一起fold进fat jar;如果依赖范围标记为provided,比如servlet-api,打出的可执行jar运行时会缺少这个依赖,但打war部署到外部Tomcat则不会有问题。这些细节往往才是区分熟手和新手的分水岭。
Redis Stream的应用现在也是一个硬核考点。我遇到过这样的题抄送:Spring Boot项目里Redis Stream如何拉取队列消息。正确的思路是用RedisTemplate操作Stream,但有一个常见坑——配置完StreamMessageListenerContainer后,如果不手动调用start(),消费者组根本不会真正创建。基本原理是,Stream支持独立消费和消费者组消费两种模式,项目里要实现“消息只被一个消费者处理”,需要建消费者组:XGROUP CREATE,再通过XREADGROUP GROUP拉取消息。
下面是一个简化版的容器配置示例,方便你在白板上能写出核心骨架:
java复制@Bean
public StreamMessageListenerContainer<String, MapRecord<String, Object, Object>> streamContainer(
RedisConnectionFactory factory,
StreamMessageListenerContainer<String, MapRecord<String, Object, Object>> container) {
StreamMessageListenerContainer.StreamMessageListenerContainerOptions<String, MapRecord<String, Object, Object>> options =
StreamMessageListenerContainer.StreamMessageListenerContainerOptions
.builder()
.pollTimeout(Duration.ofMillis(1000))
