第六篇:面试官:SpringBoot “隐藏技能“ 10 问(第六弹·附图解)

面试官:SpringBoot “隐藏技能” 10 问(第六弹·附图解)

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

  • 形式:对话 + 图解 + 大白话
  • 场景:深度优化与隐藏特性
  • 目标:解锁 SpringBoot 隐藏技能

引言

经过前五弹,你的基础、打包、监控都过关。老王继续刁钻:这次聚焦 启动钩子、嵌入式容器、配置新特性、测试新姿势。看你还能不能招架!


1. CommandLineRunnerApplicationRunner 区别?执行顺序怎么调?

面试官: 项目启动后要做预热,你选哪个?

候选人: 两者都在 容器刷新完成后 回调:

  • CommandLineRunner 收到 String[] args 原始参数
  • ApplicationRunner 封装为 ApplicationArguments,支持 option vs non-option 解析。

控制顺序:实现 Ordered 接口或标注 @Order,值越小优先执行。


2. 如何自定义内嵌 Tomcat 线程池?

TomcatServletWebServerFactory
Connector
Executor

候选人:

@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 实现?

面试官: 线上写库慢怎么办?

候选人:

  1. 配置 主从 DataSource
spring:
  datasource:
    master:
      url: jdbc:mysql://m
    slave:
      url: jdbc:mysql://s
  1. 基于 AbstractRoutingDataSourceRoutingDataSource 根据 ThreadLocal 决定 master/slave。
  2. 用 AOP 拦截 @ReadOnly 方法切换到从库。

4. Boot 2.4+ 的 Config Data API 有什么变化?

应用 ConfigDataLoader 解析 application.yml 解析 ConfigDataLocation (classpath,file,git) PropertySource 应用 ConfigDataLoader

候选人: 关键点:

  • 替换旧的 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-encoderlogback-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 需要哪些条件?

候选人:

  1. JDK 9+ ALPN(或使用 OpenSSL in Netty)。
  2. 使用 TLS,Tomcat 配置 server.http2.enabled=true 并开启 SSL。
  3. Undertow 网卡支持直接 enabled=true

收益:多路复用、头压缩。


9. Testcontainers + SpringBoot 如何零配置联动?

Testcontainers
Docker DB
Spring Boot

候选人: 加依赖 testcontainersspring-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 工具箱更锋利!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值