# 1. @Cacheable 的 sync=true 在高并发下避免击穿(Cache Stampede)的实现 A sync=true 让并发线程共享一次加载,单线程加载避免缓存击穿 ✓ 正确答案 B sync=true 让每个线程都加载 C sync=true 与缓存击穿无关 D sync=true 只支持多 key 组合
# 2. @Cacheable 缓存值的序列化(GenericJackson2JsonRedisSerializer) A 它只能序列化字符串 B 它把对象序列化为 JSON 并保留类型信息,反序列化时还原对象,可读且跨语言 ✓ 正确答案 C 它不保留类型信息 D 它比 JDK 序列化更不可读
# 3. CacheManager 的 SPI 在 Redis(Caffeine)+ 多级缓存场景下的实现细节 A 本地缓存天然一致 B 多级缓存无需一致性处理 C CacheManager 只能用于单一缓存 D 自定义 CacheManager 包装 Caffeine(本地)+ Redis(远程),需处理本地缓存一致性失效广播 ✓ 正确答案
# 4. Spring 7 中 CacheResolver 在动态选择缓存(按租户、按业务线)的工程价值 A 缓存名只能在注解中静态指定 B 自定义 CacheResolver 可按租户/业务线动态选择缓存名,实现缓存隔离与差异化策略 ✓ 正确答案 C CacheResolver 与 CacheManager 无关 D 无法动态选择缓存
# 5. Spring Cache 与 Redis 集成(RedisCacheManager) A 它只能用于本地缓存 B 它管理 Redis 缓存,配置 TTL、序列化与前缀,@Cacheable 通过它读写 Redis ✓ 正确答案 C 序列化策略无需配置 D 它不管理 TTL
# 6. Spring Integration 与 Kafka Streams 的整合 A 两者功能完全重叠 B Spring Integration 负责消息接入与路由,Kafka Streams 负责流处理,二者互补 ✓ 正确答案 C Kafka Streams 只做消息收发 D Spring Integration 做流处理
# 7. Spring Integration 的 Message/Channel/Endpoint 模型 A Endpoint 只做传输 B 只有 Message 与 Channel C Message 封装数据,Channel 承载传递,Endpoint 处理消息,三者组成集成流 ✓ 正确答案 D 模型与 EIP 无关
# 8. Spring Integration 的事务边界 A 消息处理无事务 B 可在消息处理端点或 poller 配置事务,使消息处理具备事务性 ✓ 正确答案 C 事务边界无法配置 D 事务只作用于整个应用
# 9. @Cacheable/@CachePut/@CacheEvict 的语义差异 A @CachePut 先查缓存 B 三者都读缓存 C @Cacheable 读缓存、@CachePut 写缓存(总执行方法)、@CacheEvict 删缓存 ✓ 正确答案 D @CacheEvict 只写缓存
# 10. @Gateway 与 Spring Integration 的服务调用 A 网关不能接收应答 B 网关方法直接执行业务逻辑 C 网关与消息流无关 D @Gateway 把接口方法调用映射为消息发送到通道,返回值从应答通道接收,封装消息流 ✓ 正确答案
# 11. Cache.put 与 Cache.evictIfPresent 的工程价值 A 只能通过注解操作缓存 B 两者都无条件删除 C evictIfPresent 与 evict 相同 D put 显式写入缓存,evictIfPresent 仅当 key 存在时删除,提供精细缓存控制 ✓ 正确答案
# 13. Spring Cache 6.x/7.x 的演进 A 缓存抽象被完全重写 B 缓存抽象稳定,增强可观测性、AI 缓存支持与细粒度操作(如 evictIfPresent) ✓ 正确答案 C 无任何新特性 D 只增强性能
# 14. Spring Cache 与 Caffeine 集成 A Caffeine 与 Spring Cache 无关 B Caffeine 只能做远程缓存 C Caffeine 无法配置容量 D 通过 CaffeineCacheManager 集成,配置 maximumSize/expireAfterWrite 等控制本地缓存 ✓ 正确答案
# 15. Spring Cache 与 JSR-107(JCache)的集成 A JCache 与 Spring Cache 互不兼容 B Spring Cache 通过 JCacheCacheManager 适配 JCache 标准,使 @Cacheable 可操作 JCache 缓存 ✓ 正确答案 C JCacheCacheManager 只适配默认缓存 D JCache 是 Spring 私有 API
# 16. Spring Cache 与 Spring Modulith 的边界 A 两者都管缓存 B Spring Cache 管数据缓存,Spring Modulith 管模块化架构,二者维度不同可协同 ✓ 正确答案 C 两者都管模块化 D 两者完全重叠
# 17. Spring Cache 失效事件的发布(CacheInvalidationEvent) A 本地缓存无需同步 B 失效事件与分布式无关 C 缓存失效时发布事件,用于跨节点同步失效,解决多实例本地缓存一致性 ✓ 正确答案 D 事件只在单节点生效
# 18. Spring Cache 抽象(CacheManager/Cache)的体系 A CacheManager 直接操作数据 B 只有 Cache 一个接口 C 缓存后端无法切换 D CacheManager 管理缓存,Cache 定义操作,各后端实现可插拔、注解不变 ✓ 正确答案
# 19. Spring Cache 的 @Cacheable/@CacheEvict/@CachePut 在 Spring Framework 7 中的语义变化与 SpEL 解析边界 A SpEL 无解析边界 B 三注解语义被重写 C 三注解语义稳定,演进在可观测性与 SpEL 解析健壮性,key/condition/unless 作用域不同 ✓ 正确答案 D 只能解析固定表达式
# 20. Spring Cache 的 CacheErrorHandler 自定义 A 自定义 CacheErrorHandler 可让缓存异常降级处理,不影响主业务逻辑 ✓ 正确答案 B 缓存异常必须抛出 C 缓存失败会中断业务 D CacheErrorHandler 无法自定义
# 21. Spring Integration 6.x 的响应式支持 A 响应式端点返回同步对象 B 只支持阻塞处理 C 提供响应式 Channel 与端点,支持 Reactor 的 Flux/Mono 与背压 ✓ 正确答案 D 与 Reactor 无关
# 22. Spring Integration 与 Spring Batch 的边界 A Integration 管消息集成,Batch 管批处理,二者可协作(消息触发 Job) ✓ 正确答案 B 两者都做批处理 C 两者都做消息路由 D 无法协作
# 23. Spring Integration 与 Spring Cloud Stream 的边界 A Spring Integration 是更上层的抽象 B 两者完全独立 C Spring Cloud Stream 基于 Spring Integration 提供消息驱动微服务抽象与 binder 绑定 ✓ 正确答案 D 两者都做批处理
# 24. Spring Integration 与 Spring Modulith 事件的关系 A Spring Modulith 提供模块内事件,可结合 Spring Integration 桥接到外部消息系统 ✓ 正确答案 B 两者互不相关 C 事件只能留在模块内 D Integration 管模块化
# 25. Spring Integration 在 Spring 6.x 的演进 A 无任何变化 B 无响应式支持 C 仍基于 javax D 基线提升到 Java 17 与 Jakarta,增强响应式支持与适配器 ✓ 正确答案
# 26. Spring Integration 测试支持(@SpringIntegrationTest) A 它不加载集成上下文 B 它只能测试数据库 C 消息流无法测试 D 用它加载集成上下文,模拟消息发送并验证消息处理结果 ✓ 正确答案
# 27. Spring Integration 的监控指标 A 无法集成 Micrometer B 无监控指标 C 指标只能本地查看 D 通过 Micrometer 暴露通道/端点统计(消息数、处理时间、队列深度),用于监控 ✓ 正确答案
# 28. @CacheEvict 的 beforeInvocation=true 与 afterInvocation 在方法抛异常时的缓存行为差异 A 方法异常时两者都删 B 两者都在方法后删 C beforeInvocation=true 在方法执行前删缓存,方法异常也会删;默认 afterInvocation 方法异常不删 ✓ 正确答案 D 两者行为相同
# 29. Spring Cache 的 key 生成策略(KeyGenerator/SimpleKey)与 SpEL 自定义 key 的坑 A 默认 SimpleKey 基于参数,SpEL 自定义 key 需注意参数名编译与对象 equals/hashCode ✓ 正确答案 B key 无需考虑参数 C SpEL 参数名无需配置 D 对象直接作 key 无需重写 equals
# 30. 缓存预热(启动加载)与异步刷新的实现方式,如何避免缓存雪崩 A 预热与雪崩无关 B 缓存雪崩无法避免 C 启动预热热点、异步刷新、TTL 随机化与多级缓存共同避免缓存雪崩 ✓ 正确答案 D TTL 越集中越好
# 31. @Cacheable/@CachePut/@CacheEvict 的语义与组合,缓存击穿/穿透/雪崩如何应对? A 击穿用 sync=true、穿透用空值缓存/布隆过滤、雪崩用 TTL 随机化与多级缓存 ✓ 正确答案 B 三类问题同一策略解决 C 击穿与 sync 无关 D 穿透无需处理
# 32. Spring 消息抽象,JmsTemplate/KafkaTemplate 与 @JmsListener/@KafkaListener 的确认与重试如何? A JmsTemplate/KafkaTemplate 发送,@JmsListener/@KafkaListener 消费,手动 ack 与重试策略保障可靠投递 ✓ 正确答案 B 消息自动确认,无需重试 C 确认与重试无关 D 无法手动确认
# 33. @Cacheable 对方法返回 null 的默认行为(不缓存)与 null 值缓存策略 A 无法控制 null 缓存 B 默认缓存 null C null 缓存与穿透无关 D 默认返回 null 不缓存,allowNullValues=true 可缓存空值防缓存穿透 ✓ 正确答案