中通 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圣经

全部评论

相关推荐

评论
点赞
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务