面试官:SpringBoot “隐藏技能” 10 问(第六弹·附图解)
第六篇 · 10 道 SpringBoot 面试题(全新不重复)
- 形式:对话 + 图解 + 大白话
- 场景:深度优化与隐藏特性
- 目标:解锁 SpringBoot 隐藏技能
引言
经过前五弹,你的基础、打包、监控都过关。老王继续刁钻:这次聚焦 启动钩子、嵌入式容器、配置新特性、测试新姿势。看你还能不能招架!
1. CommandLineRunner
与 ApplicationRunner
区别?执行顺序怎么调?
面试官: 项目启动后要做预热,你选哪个?
候选人: 两者都在 容器刷新完成后 回调:
CommandLineRunner
收到String[] args
原始参数。ApplicationRunner
封装为ApplicationArguments
,支持 option vs non-option 解析。
控制顺序:实现 Ordered
接口或标注 @Order
,值越小优先执行。
2. 如何自定义内嵌 Tomcat 线程池?
候选人:
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> customizer(){
return factory -> factory.addConnectorCustomizers(connector -> {
ProtocolHandler handler = connector.getProtocolHandler();
if(handler instanceof AbstractProtocol<?> p){
p.setMaxThreads(400);
p.setAcceptCount(200);
}
});
}
或 YAML 快捷:
server.tomcat.max-threads: 400
server.tomcat.accept-count: 200
3. 多数据源 & 读写分离怎么在 Boot 实现?
面试官: 线上写库慢怎么办?
候选人:
- 配置 主从 DataSource:
spring:
datasource:
master:
url: jdbc:mysql://m
slave:
url: jdbc:mysql://s
- 基于
AbstractRoutingDataSource
写RoutingDataSource
根据ThreadLocal
决定 master/slave。 - 用 AOP 拦截
@ReadOnly
方法切换到从库。
4. Boot 2.4+ 的 Config Data API 有什么变化?
候选人: 关键点:
- 替换旧的
ConfigFileApplicationListener
。 - 支持
config/import:
关键字引入远程/额外配置文件。 - 顺序规则更清晰,废弃
spring.config.location
。
5. spring.profiles.group
能解决什么痛点?
候选人: 把一堆 profile 组合成组,例如:
spring:
profiles:
group:
prod: [common, mysql, redis]
激活 prod
自动加载 common + mysql + redis,不再手动列长串参数,方便 模块化配置。
6. 如何输出 JSON 结构化日志?
面试官: ELK 要求 JSON,Logback 默认不行?
候选人: 引入 logstash-logback-encoder
,logback-spring.xml
:
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"/>
Boot 自动识别,日志即 JSON,Kibana 秒解析。
7. Spring Security 如何同时配置 CORS 和关闭 CSRF?
@Bean
SecurityFilterChain chain(HttpSecurity http) throws Exception {
return http
.cors().and()
.csrf().disable()
.build();
}
候选人: @Bean CorsConfigurationSource
决定允许域;SPA 场景常见写法。
8. 启用 HTTP/2 需要哪些条件?
候选人:
- JDK 9+ ALPN(或使用 OpenSSL in Netty)。
- 使用 TLS,Tomcat 配置
server.http2.enabled=true
并开启 SSL。 - Undertow 网卡支持直接
enabled=true
。
收益:多路复用、头压缩。
9. Testcontainers + SpringBoot 如何零配置联动?
候选人: 加依赖 testcontainers
与 spring-boot-testcontainers
(3.1+)。@ServiceConnection
自动替换 jdbc:
属性,测试启动时拉取数据库镜像,无需本地安装。
10. 嵌套属性校验与国际化错误信息?
面试官: ConfigProps 里有 List 怎么校验?
候选人:
public class PayProps {
@Valid
private List<@NotBlank String> channels;
}
错误信息放 ValidationMessages_zh_CN.properties
,Boot 根据 spring.messages.basename
国际化,前端收到中文提示。
结语
第六弹聚焦隐藏技能与配置升级,掌握这些招式,你的 SpringBoot 工具箱更锋利!