中通 JAVA软件开发 二面 面经
1. 自我介绍
答:
- 按"背景 → 技术栈 → 代表项目 → 求职意向"四段走,控制在2分钟
- 重点突出和岗位相关的经验,高并发、分布式、微服务方向的经历要重点说
- 不要把简历从头念一遍,说亮点和技术深度
2. 介绍一下你做过的最复杂的项目,重点说技术难点和你的解决方案
答:
- 考察技术深度和解决问题的能力,不是功能列表
- 回答结构:项目背景(一句话)→ 核心技术挑战(具体说难在哪)→ 你的解法(为什么这么做)→ 结果数据
- 面试官会顺着细节追问,只说你真正主导过的部分
3. Spring的IOC容器初始化流程是怎样的
答:分七个阶段:
- 资源定位:找到Bean的定义信息,XML配置加载文件,注解配置扫描包,通过ResourceLoader封装成Resource对象
- 加载解析:把Resource解析成BeanDefinition,包含类名、作用域、依赖关系、初始化方法等元数据
- 注册:把BeanDefinition存入ConcurrentHashMap(BeanDefinitionRegistry),key是beanName,此时Bean还未实例化
- 实例化:调用getBean时才真正创建,通过反射调用构造器,FactoryBean走特殊逻辑
- 属性填充:反射给属性赋值,依赖的Bean未创建则递归调用getBean,三级缓存解决循环依赖
- 初始化:依次调用Aware接口方法 → BeanPostProcessor前置处理 → afterPropertiesSet/init-method → BeanPostProcessor后置处理,AOP代理在后置处理中创建
- 使用与销毁:Bean放入一级缓存singletonObjects,容器关闭时调用destroy方法释放资源
4. MySQL的索引失效场景有哪些,如何避免
答:主要八种场景:
- 索引列上使用函数或表达式:
WHERE YEAR(create_time) = 2024,改写成范围查询 - 隐式类型转换:varchar字段用数字查询,MySQL内部转换导致失效,保证类型一致
- LIKE以%开头:
LIKE '%张三'无法走索引,改成LIKE '张三%'或用全文索引 - OR条件有字段无索引:OR的所有字段都要有索引,否则全表扫描,或改用UNION
- NOT/!=/<>:否定条件通常不走索引,改写成正向条件
- 联合索引不满足最左前缀:索引(a,b,c),查询跳过a直接用b,c,不走索引,调整查询条件或重建索引
- 范围查询后的字段失效:索引(a,b,c),b用了范围查询,c不走索引,把范围查询字段放最后
- 数据分布问题:查询数据量超过30%,优化器选择全表扫描,用覆盖索引或优化查询条件
- 总原则:不在索引列做运算、注意类型匹配、遵循最左前缀、用EXPLAIN分析执行计划
5. 如何设计一个秒杀系统
答:核心思路是削峰填谷、异步处理、多级防护:
- 前端层:按钮防重、倒计时、验证码,静态资源CDN加速
- 网关层:Nginx限流,单IP频率限制,黑名单过滤
- 库存预热:秒杀前把库存加载到Redis,key为
seckill:stock:{商品ID} - 请求拦截:Redis校验用户资格、活动状态、是否重复购买,不查数据库
- 库存扣减:Lua脚本原子性扣减Redis库存,保证并发安全
- 异步下单:扣减成功立即返回"排队中",发MQ消息,消费者异步创建订单写数据库,失败则回滚Redis库存
- 数据库保底:UPDATE加
WHERE stock > 0条件,防止超卖兜底 - 限流降级:Sentinel对秒杀接口限流,超阈值拒绝请求,异常率超50%熔断
- 超时处理:延迟队列处理超时未支付订单,取消后回滚库存
- 压测验证:上线前模拟高并发场景,找出瓶颈
6. 分布式事务的解决方案有哪些
答:六种主流方案:
- 2PC(两阶段提交):协调者+参与者,强一致性,但同步阻塞、单点故障风险
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
Java面试圣经 文章被收录于专栏
Java面试圣经,带你练透java圣经
查看18道真题和解析