全站扩展点地图
本页用于统一梳理各技术栏目必须掌握的“扩展点”。这里的扩展点不是简单列名词,而是指:
一个技术在真实项目中,允许你改变默认行为、接入业务能力、增强可观测性、处理故障、提升可维护性的关键入口。
学习一个技术不能只学“怎么用”,还要学:
- 默认行为是什么。
- 为什么默认行为这样设计。
- 扩展点在哪里。
- 扩展后会影响哪条执行链路。
- 如果不用扩展点硬写业务代码,会带来什么问题。
- 面试怎么从标准答案跳到原理页。
学习路线
mermaid
flowchart TD
A["先学默认链路"] --> B["再学原理"]
B --> C["找到扩展点"]
C --> D["写最小 Demo"]
D --> E["放到商业场景"]
E --> F["总结面试回答"]Java SE
| 方向 | 必补扩展点 | 面试追问方向 | 原理页 |
|---|---|---|---|
| 集合 | 自定义排序、HashMap 扩容、ConcurrentHashMap 分段到 CAS | 为什么 HashMap 线程不安全,JDK7/8 扩容区别 | 集合框架 |
| 泛型 | 类型擦除、通配符、泛型方法 | 为什么运行时拿不到泛型真实类型 | 泛型 |
| 注解反射 | 自定义注解、反射创建对象、Method 调用 | Spring 为什么能按注解装配 | 反射 |
| IO/NIO | Charset、Buffer、Channel、Selector、零拷贝 | BIO/NIO/AIO 区别,Selector 为什么能多路复用 | IO与NIO |
| 并发 | ThreadLocal、AQS、Lock、CAS、volatile | 可见性、原子性、有序性怎么保证 | 多线程 |
| 线程池 | ThreadFactory、RejectedExecutionHandler、BlockingQueue | 核心参数、执行流程、拒绝策略、线程池 OOM | 线程池 |
| JVM | 类加载器、自定义 ClassLoader、GC 参数、JFR、jstack | OOM 怎么排查,类加载双亲委派为什么存在 | JVM组成 |
Spring
| 方向 | 必补扩展点 | 面试追问方向 | 原理页 |
|---|---|---|---|
| IOC | BeanDefinition、BeanFactory、ApplicationContext | IOC 是不是 Map,BeanDefinition 有什么用 | Spring IOC |
| 生命周期 | Aware、InitializingBean、DisposableBean | Bean 创建过程有哪些步骤 | Bean生命周期 |
| 容器扩展 | BeanFactoryPostProcessor、BeanPostProcessor、FactoryBean | 二者区别,AOP 代理怎么创建 | Spring核心扩展点 |
| 配置导入 | ImportSelector、DeferredImportSelector、Registrar | Boot 自动配置为什么能导入配置类 | Spring核心扩展点 |
| AOP | Advisor、Pointcut、MethodInterceptor | JDK/CGLIB 区别,自调用为什么失效 | Spring AOP |
| 事务 | TransactionManager、传播行为、rollbackFor | 事务失效有哪些原因 | Spring事务 |
| 事件 | ApplicationEventPublisher、@EventListener | Spring 事件能否替代 MQ | Spring核心扩展点 |
Spring Boot
| 方向 | 必补扩展点 | 面试追问方向 | 原理页 |
|---|---|---|---|
| 自动配置 | AutoConfigurationImportSelector、条件注解 | 自动配置为什么不是魔法 | 自动配置原理 |
| Starter | autoconfigure、Properties、imports | Starter 和自动配置关系 | Starter机制 |
| 启动扩展 | EnvironmentPostProcessor、Initializer、Runner | 配置解密和缓存预热放哪里 | Spring Boot扩展点 |
| Web 扩展 | Filter、Interceptor、ArgumentResolver、MessageConverter | Filter 和 Interceptor 区别 | Spring Boot扩展点 |
| 配置绑定 | ConfigurationProperties、Profile、PropertySource | @Value 和配置属性类怎么选 | 配置体系 |
| 监控 | HealthIndicator、MeterRegistry、Endpoint | 生产健康检查怎么做 | Actuator监控 |
| 失败诊断 | FailureAnalyzer | Starter 报错怎么让接入方看懂 | Spring Boot扩展点 |
Spring Cloud
| 方向 | 必补扩展点 | 面试追问方向 | 原理页 |
|---|---|---|---|
| 注册发现 | ServiceRegistry、DiscoveryClient | 注册中心挂了还能不能调 | Nacos |
| 负载均衡 | ServiceInstanceListSupplier、LoadBalancer | Ribbon 和 LoadBalancer 区别 | 负载均衡 |
| Feign | Contract、Encoder、Decoder、RequestInterceptor、ErrorDecoder | Feign 为什么像本地调用但不是本地调用 | Feign |
| Gateway | RoutePredicateFactory、GatewayFilterFactory、GlobalFilter | Gateway 和 Nginx 区别 | Gateway |
| 熔断限流 | Sentinel 规则、BlockHandler、Fallback | 限流、熔断、降级区别 | Sentinel |
| 配置中心 | Nacos Config、RefreshScope、Bus | 动态刷新怎么生效 | 配置中心 |
| 链路追踪 | TraceId、Span、采样、上下文传播 | 日志和链路怎么串起来 | 可观测性 |
Spring Security
| 方向 | 必补扩展点 | 面试追问方向 | 原理页 |
|---|---|---|---|
| 过滤器链 | SecurityFilterChain、OncePerRequestFilter | 认证请求经过哪些过滤器 | Spring Security |
| 认证 | AuthenticationProvider、UserDetailsService | 登录认证怎么扩展数据库用户 | Spring Security |
| 授权 | AuthorizationManager、AccessDecision | RBAC 权限怎么落地 | Spring Security |
| JWT | Token 生成、解析、刷新、黑名单 | JWT 无状态怎么退出登录 | Spring Security |
| OAuth2 | Client、Resource Server、Authorization Server | 授权码模式为什么安全 | Spring Security |
ORM
| 方向 | 必补扩展点 | 面试追问方向 | 原理页 |
|---|---|---|---|
| MyBatis | Executor、StatementHandler、ParameterHandler、ResultSetHandler | MyBatis 插件为什么能拦截执行链 | MyBatis插件 |
| Mapper | MapperProxy、SqlSession、MappedStatement | Mapper 接口为什么不用实现类 | MyBatis核心 |
| 缓存 | 一级缓存、二级缓存、自定义 Cache | MyBatis 缓存什么时候失效 | MyBatis缓存 |
| MyBatis-Plus | Wrapper、MetaObjectHandler、Interceptor | 自动填充和分页插件怎么工作 | MyBatis-Plus |
| JPA | Repository、EntityManager、Specification | N+1 问题怎么解决 | Spring Data JPA |
MySQL
| 方向 | 必补扩展点 | 面试追问方向 | 原理页 |
|---|---|---|---|
| 索引 | 联合索引、覆盖索引、索引下推 | 为什么最左前缀,为什么索引失效 | 索引 |
| 执行计划 | EXPLAIN、type、key、rows、Extra | 慢 SQL 怎么定位 | EXPLAIN |
| 事务 | 隔离级别、MVCC、undo log | 可重复读怎么实现 | 事务 |
| 锁 | 行锁、间隙锁、next-key lock | 为什么 update 会锁范围 | 锁机制 |
| 日志 | redo、undo、binlog | 两阶段提交解决什么 | redo log与binlog |
| 高可用 | 主从复制、读写分离、分库分表 | 主从延迟怎么办 | MySQL |
Redis
| 方向 | 必补扩展点 | 面试追问方向 | 原理页 |
|---|---|---|---|
| 数据结构 | String、Hash、List、Set、ZSet、Bitmap | ZSet 为什么适合排行榜 | Redis基础 |
| 缓存治理 | 布隆过滤器、互斥锁、逻辑过期 | 穿透、击穿、雪崩区别 | 缓存问题 |
| 分布式锁 | Lua、Redisson、看门狗、Redlock | 锁为什么还要幂等 | 分布式锁 |
| 锁扩展 | 公平锁、读写锁、信号量、Fencing Token | 红锁能否保证绝对安全 | 锁扩展点 |
| 高可用 | 主从、哨兵、Cluster、脑裂 | 哨兵和 Cluster 区别 | 主从哨兵集群 |
| 排查 | big key、hot key、慢查询、内存淘汰 | Redis CPU 高怎么查 | Redis面试 |
消息队列
| 方向 | 必补扩展点 | 面试追问方向 | 原理页 |
|---|---|---|---|
| MQ 总览 | ACK、重试、死信、延迟、幂等 | MQ 如何保证不丢不重 | 消息队列 |
| Kafka | Producer 拦截器、分区器、ConsumerRebalanceListener | Kafka 为什么吞吐高,offset 怎么提交 | Kafka |
| RocketMQ | 事务消息、顺序消息、延迟消息、死信 | 半消息和事务回查怎么工作 | RocketMQ |
| RabbitMQ | Exchange、Queue、Binding、DLX、TTL | 消息确认和死信队列怎么用 | RabbitMQ |
| 可靠性 | 本地消息表、Outbox、幂等消费 | 发送成功但本地事务失败怎么办 | 可靠消息 |
分布式
| 方向 | 必补扩展点 | 面试追问方向 | 原理页 |
|---|---|---|---|
| 理论 | CAP、BASE、一致性模型 | CAP 是三选二吗 | CAP与BASE |
| ZooKeeper | znode、Watcher、Session、ZAB、Curator Recipes | ZK 为什么能做注册中心、锁和选主 | ZooKeeper |
| Dubbo | Filter、LoadBalance、Router、Protocol、Serialization、Cluster、SPI | Dubbo 一次调用怎么走,SPI 为什么重要 | Dubbo |
| 幂等 | 唯一约束、Token、状态机、去重表 | 重复请求怎么处理 | 幂等设计 |
| 事务 | XA、TCC、Saga、可靠消息、Seata | JTA 是不是分布式事务 | 分布式事务 |
| 缓存一致性 | Cache Aside、延迟双删、消息补偿 | 数据库和缓存不一致怎么办 | 缓存一致性 |
| 限流熔断 | 令牌桶、漏桶、熔断器、隔离 | 为什么只重试会雪崩 | 限流 |
| 锁 | Redis、ZK、etcd、DB、MQ 顺序消费 | 分布式锁怎么选 | 锁扩展点 |
Elasticsearch
| 方向 | 必补扩展点 | 面试追问方向 | 原理页 |
|---|---|---|---|
| Mapping | 字段类型、keyword/text、dynamic template | Mapping 为什么不能随便改 | ES |
| Analyzer | char filter、tokenizer、token filter | 分词器怎么影响搜索结果 | ES分词 |
| 查询 | bool、filter、must、should、function_score | query 和 filter 区别 | ES查询 |
| 写入 | refresh、translog、segment、merge | 写入后为什么不能立刻搜到 | ES |
| 搜索 | 倒排索引、BM25、分页、排序 | 深分页为什么慢 | ES业务场景 |
| 运维 | shard、replica、alias、template、ILM | ES 集群 yellow/red 怎么排查 | ES集群 |
定时任务
| 方向 | 必补扩展点 | 面试追问方向 | 原理页 |
|---|---|---|---|
| Spring Scheduled | cron、线程池、分布式重复执行 | 多实例为什么会重复跑 | Spring Scheduled |
| XXL-JOB | 调度中心、执行器、路由策略、分片广播 | XXL-JOB 如何避免重复执行 | XXL-JOB |
| Quartz | Job、Trigger、JobStore、Misfire | Quartz 和 XXL-JOB 怎么选 | 定时任务 |
| 可靠性 | 幂等、超时、失败重试、补偿 | 任务执行一半失败怎么办 | 定时任务 |
Netty
| 方向 | 必补扩展点 | 面试追问方向 | 原理页 |
|---|---|---|---|
| Reactor | Boss、Worker、EventLoop | Netty 为什么高性能 | Netty |
| Pipeline | ChannelHandler、Inbound、Outbound | 入站出站事件怎么流转 | Netty |
| 编解码 | Decoder、Encoder、粘包拆包 | TCP 为什么会粘包 | Netty |
| ByteBuf | 池化、引用计数、零拷贝 | 内存泄漏怎么排查 | Netty |
| 心跳 | IdleStateHandler、重连 | 长连接怎么保活 | Netty |
信息安全
| 方向 | 必补扩展点 | 面试追问方向 | 原理页 |
|---|---|---|---|
| 加密 | 对称、非对称、混合加密 | HTTPS 为什么用混合加密 | 加密基础 |
| 哈希 | MD5、SHA、盐、慢哈希 | 密码为什么不能明文或直接 MD5 | 信息安全 |
| 签名 | HMAC、RSA 签名、防篡改 | 接口签名怎么防重放 | 信息安全 |
| TLS | 证书、CA、握手、会话密钥 | 浏览器如何信任证书 | 信息安全 |
| 数据保护 | 脱敏、密钥管理、最小权限 | 医疗数据怎么保护隐私 | 信息安全 |
DevOps
| 方向 | 必补扩展点 | 面试追问方向 | 原理页 |
|---|---|---|---|
| Docker | Dockerfile、镜像层、Volume、Network | 镜像为什么要分层 | Docker |
| Nginx | 反向代理、负载均衡、限流、HTTPS | Nginx 和 Gateway 区别 | Nginx |
| Jenkins | Pipeline、凭据、制品、回滚 | CI/CD 怎么保证安全 | Jenkins |
| K8s | Pod、Deployment、Service、Ingress、探针 | 一次部署在 K8s 里怎么走 | K8s |
| 可观测性 | 日志、指标、链路、告警 | 线上慢怎么定位 | DevOps |
工作流
| 方向 | 必补扩展点 | 面试追问方向 | 原理页 |
|---|---|---|---|
| BPMN | 流程定义、实例、任务、网关 | 流程定义和流程实例区别 | 工作流 |
| 审批 | 驳回、撤回、转办、会签 | 审批流怎么建模 | 流程设计 |
| 业务集成 | 业务表、流程表、状态同步 | 业务状态和流程状态怎么一致 | 工作流 |
| 排查 | 流程卡住、变量错误、版本问题 | 为什么任务查不到 | 任务API |
Python
| 方向 | 必补扩展点 | 面试追问方向 | 原理页 |
|---|---|---|---|
| 语言基础 | 装饰器、上下文管理器、迭代器、生成器 | 装饰器为什么能增强函数 | Python |
| 类型 | typing、Protocol、dataclass | Python 动态语言为什么还要类型标注 | Python |
| 并发 | threading、multiprocessing、asyncio | GIL 是什么,asyncio 为什么不是多线程 | Python |
| Web | FastAPI 依赖注入、中间件、异常处理 | FastAPI 为什么性能高 | Python |
| 数据 | pandas、SQLAlchemy、连接池 | 大文件怎么处理不 OOM | Python |
| AI 开发 | LangChain、向量库、工具调用 | RAG 链路怎么做 | AI |
AI
| 方向 | 必补扩展点 | 面试追问方向 | 原理页 |
|---|---|---|---|
| Prompt | 系统提示、Few-shot、模板变量 | 为什么同样模型效果不同 | AI |
| RAG | Chunk、Embedding、VectorStore、Rerank | RAG 为什么能减少幻觉 | AI |
| Agent | Tool Calling、Planning、Memory | Agent 和普通聊天区别 | AI |
| 评估 | 离线评估、线上反馈、命中率 | AI 应用怎么证明效果好 | AI |
| 安全 | Prompt Injection、权限、脱敏 | 大模型为什么不能直接连生产库 | AI |
| Spring AI | ChatClient、Advisor、Tool、VectorStore | Java 项目怎么接入大模型 | Spring AI |
Go
| 方向 | 必补扩展点 | 面试追问方向 | 原理页 |
|---|---|---|---|
| 基础 | slice、map、interface、defer | slice 扩容和 map 并发安全吗 | Go |
| 并发 | goroutine、channel、select、context | channel 关闭和超时怎么处理 | Go |
| 调度 | GMP、抢占、网络轮询器 | goroutine 为什么轻量 | Go |
| 工程 | module、testing、pprof、日志 | Go 服务 CPU 高怎么查 | Go |
| Web | middleware、context、error handling | Go Web 中间件怎么设计 | Go |
面试页统一要求
每个面试页都要保持这种模式:
mermaid
flowchart TD
A["面试标准回答"] --> B["常见追问"]
B --> C["跳转知识点原理"]
C --> D["流程图和 Demo"]
D --> E["商业场景和排查"]面试页不应该堆长篇原理。正确结构是:
| 区域 | 内容 |
|---|---|
| 标准回答 | 1 到 2 段能直接说出口的话 |
| 追问点 | 面试官继续问时怎么展开 |
| 项目话术 | 在医疗采集、订单、支付、库存、搜索、批处理等场景怎么落地 |
| 知识点跳转 | 跳到详细原理页,不让面试页变成大杂烩 |
本章小结
后续补文档时,不再只补“是什么”。每个技术栏目都要围绕默认链路、扩展点、原理、Demo、商业场景、排查和面试追问建立闭环。Spring Boot 自动配置、Spring 容器扩展点、Redis 锁扩展点只是第一批样板,其他栏目也要按这个标准继续补齐。
