中科创达 Java开发 二面 面经

1. 介绍一下Spring Boot的自动配置原理

Spring Boot的自动配置主要基于以下几个核心机制:

@SpringBootApplication注解:这是一个组合注解,包含了@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan三个注解

@EnableAutoConfiguration的工作原理

  • 通过@Import注解导入AutoConfigurationImportSelector类
  • 该类会读取META-INF/spring.factories文件中的配置类
  • 加载所有候选的自动配置类

条件注解机制

  • 使用@ConditionalOnClass判断类路径下是否存在某个类
  • 使用@ConditionalOnBean判断容器中是否存在某个Bean
  • 使用@ConditionalOnProperty判断配置文件中是否有某个属性
  • 只有满足条件的配置类才会生效

配置优先级:用户自定义的配置优先级高于自动配置,可以通过application.properties覆盖默认配置

实际应用:比如引入spring-boot-starter-web依赖后,会自动配置Tomcat、DispatcherServlet等组件,无需手动配置

2. 说说你对Redis的理解,以及常见的应用场景

Redis是一个基于内存的高性能键值数据库,我从以下几个方面理解:

数据结构丰富

  • String:最基本的类型,可以存储字符串、数字
  • Hash:适合存储对象
  • List:有序列表,可以实现队列和栈
  • Set:无序集合,支持交并差运算
  • ZSet:有序集合,可以实现排行榜

持久化机制

  • RDB:定期生成快照,恢复速度快但可能丢失数据
  • AOF:记录每个写操作,数据更安全但文件较大
  • 可以同时使用两种方式

常见应用场景

  • 缓存:减轻数据库压力,提高响应速度
  • 分布式锁:使用SETNX实现
  • 消息队列:使用List或Stream实现
  • 排行榜:使用ZSet的score排序
  • 计数器:使用INCR原子操作
  • Session共享:分布式系统中存储用户会话

缓存问题及解决方案

  • 缓存穿透:查询不存在的数据,解决方法是布隆过滤器或缓存空值
  • 缓存击穿:热点key过期,解决方法是互斥锁或永不过期
  • 缓存雪崩:大量key同时过期,解决方法是过期时间加随机值

3. 讲一下MySQL的事务隔离级别,以及会产生什么问题

MySQL的事务隔离级别从低到高分为四种:

读未提交(Read Uncommitted)

  • 最低的隔离级别
  • 会产生脏读问题:事务A读到了事务B未提交的数据
  • 基本不使用

读已提交(Read Committed)

  • 只能读取已提交的数据
  • 解决了脏读问题
  • 会产生不可重复读:事务A两次读取同一数据结果不同,因为事务B在中间修改并提交了
  • Oracle默认级别

可重复读(Repeatable Read)

  • 保证在同一事务中多次读取同一数据结果一致
  • 解决了不可重复读问题
  • 会产生幻读:事务A查询某个范围的数据,事务B插入了新数据,事务A再次查询发现多了数据
  • MySQL默认级别,通过MVCC和间隙锁解决了幻读

串行化(Serializable)

  • 最高的隔离级别
  • 强制事务串行执行
  • 解决了所有并发问题
  • 性能最差,很少使用

MySQL的实现机制

  • 使用MVCC(多版本并发控制)实现读已提交和可重复读
  • 每行数据有隐藏的版本号字段
  • 读取时根据版本号判断数据可见性
  • 避免了加锁,提高了并发性能

4. 分布式系统中如何保证接口的幂等性?

接口幂等性是指多次调用产生的结果与单次调用一致,实现方式有:

数据库唯一索引

  • 在数据库表中建立唯一索引
  • 重复插入会抛出异常
  • 适用于插入操作

Token机制

  • 客户端先请求获取Token
  • 提交时携带Token
  • 服务端验证Token并删除
  • 重复提交因为Token已被删除而失败
  • 适用于表单提交

分布式锁

  • 使用Redis的SETNX或Redisson实现
  • 获取锁成功才执行业务
  • 执行完释放锁
  • 适用于高并发场景

状态机

  • 通过状态流转控制
  • 比如订单状态:待支付→已支付→已发货
  • 已支付状态不能再次支付
  • 适用于有明确状态流转的业务

乐观锁

  • 使用版本号version字段
  • 更新时判断version是否一致
  • 不一致说明数据已被修改
  • 适用于更新操作

去重表

  • 建立专门的去重表记录请求ID
  • 每次请求先查询是否存在
  • 存在则直接返回
  • 适用于需要记录请求历史的场景

5. 说说你对微服务架构的理解,以及遇到过什么问题

微服务架构是将单体应用拆分成多个小服务的架构模式:

核心特点

  • 服务独立部署:每个服务可以独立发布
  • 技术栈灵活:不同服务可以用不同技术
  • 数据库独立:每个服务有自己的数据库
  • 按业务拆分:根据业务领域划分服务

常用组件

  • 注册中心:Nacos、Eureka,实现服务注册与发现
  • 配置中心:Nacos、Apollo,统一管理配置
  • 网关:Gateway、Zuul,统一入口和路由
  • 负载均衡:Ribbon、LoadBalancer
  • 熔断降级:Sentinel、Hystrix
  • 链路追踪:Skywalking、Zipkin

遇到的问题及解决方案

  • 分布式事务:使用Seata实现AT模式或TCC模式,或者采用最终一致性方案
  • 服务雪崩:通过Sentinel设置熔断降级规则,快速失败保护系统
  • 数据一致性:使用消息队列实现最终一致性,或者使用分布式锁
  • 接口调用复杂:使用OpenFeign简化HTTP调用,声明式调用
  • 服务拆分粒度:遵循单一职责原则,不能拆得过细也不能过粗

优缺点

  • 优点:独立部署、技

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java面试圣经 文章被收录于专栏

Java面试圣经,带你练透java圣经

全部评论
二面也是技术?
点赞 回复 分享
发布于 04-24 14:57 重庆
27届实习机会或看我住业 https://careers.pddglobalhr.com/campus/intern?t=4OmKPVeX9a
点赞 回复 分享
发布于 03-11 17:32 上海
太强了
点赞 回复 分享
发布于 02-10 15:16 辽宁
mark
点赞 回复 分享
发布于 02-10 15:16 北京

相关推荐

看到这句话,就像看到了当年那个在图书馆刷行测刷到崩溃的自己。如果春招能重来,我会把这些教训焊在脑子里,当春招的“作弊器”:**① 我会更早弄明白,「匹配度」远大于「优秀度」**以前以为堆砌奖学金、学生会主席、大厂实习就能赢,重来一次我会把80%的精力花在研究岗位JD上。针对每个岗位,把简历里的经历“翻译”成他们需要的语言,用STAR法则把实习写成“解决过什么业务问题,带来多少增量”。春招不是评三好学生,是在找“来了就能干活”的人。**② 我会把“秋招失败复盘”做成逐字稿档案**所有挂在终面、二面的公司,我会把当时的面试录音(征得同意下)或回忆的问题、我的回答、面试官表情全部复盘成逐字稿。然后逼自己写出三版更好的答案。春招不是投更多,是把同一个坑彻底填平。**③ 我不会再“病急乱投医”式海投**海投带来的大多是无效面试和不断被拒的内耗。我会圈定3个赛道(如互联网运营+快消管培+国企职能),各选10-15家重点攻打。精力聚焦后,面试通过率至少翻倍。**④ 我会把群面当成“有剧本的协作表演”**不再抢着当leader,而是在前3分钟就迅速判断团队缺什么角色:缺计时者就做温柔推进的Timer,缺观点时就做贡献框架的破冰者。更重要的是,我会在开口前想清楚“这句话对推进任务有没有用”,而不是“这句话能不能显得我厉害”。**⑤ 我会把实习复盘准备成“故事会”**把每段实习拆成3-5个小故事,每个故事都有冲突、行动、结果和可迁移的思考。当面试官随口问“你觉得最有挑战的一件事是什么”,我能直接调出一个1分钟的故事,而不是现场现编。**⑥ 我会学会“不要脸”地要内推和追问反馈**在领英、脉脉上诚恳地找校友:“学长好,我认真研究过贵部门的方向,准备了几个问题,可否请您喝杯咖啡给10分钟指点?” 不管成不成,我都会在每场面试结束后礼貌追问HR:“如果有机会进入下一轮,您觉得我在哪方面还需要加强?” 哪怕被已读不回,至少自己争取过。**⑦ 我会做一张残酷但救命的“春招进度管理表”**上面列着公司、岗位、投递日期、笔试时间、面试进度、复盘笔记。这张表是我的GPS,避免我因为焦虑反复刷新邮箱浪费时间,也让我清醒地看到:即便挂了10家,后面还有5家在推进。**⑧ 我会在12月就开始刷行测、练口语和准备作品集**春招时间极短,等到3月再准备笔试题,只会被题库淹死。我会把图形推理、资料分析当成每日益智小游戏,每天30分钟;把“自我介绍”练到能三句话讲清我是谁、我为什么适合、我能带来什么价值。**⑨ 我会告诉自己:人生不会因为春招完蛋**当年觉得拿不到大厂offer天就塌了,回头看,社招转行、曲线救国、小众领域闯出一片天的例子太多了。我会把“我必须上岸”换成“我要找到现阶段的最优解”,心态稳了,面试表现反而松弛好看。**⑩ 最后,我会抱抱那个半夜改简历的自己**告诉他:你值得被看见,只是需要一点时间。如果此刻的你正处在春招的水深火热里,这些不是悔恨,是你的预装配地图。哪怕现在开始,也完全来得及。
如果春招能重来,我会__...
点赞 评论 收藏
分享
写在开头:这个人选是25年接触的,23年就毕业并gap至今;这个应该是我做的最后一个23届毕业空窗至今的人选了,4月新系统上线后毕业到一段工作之间gap超2年的搞不进了真不是海莉姐不努力,只是个打工的,规则卡死了搞不了以下是海莉姐跪求的面经,人选手搓,诚意满满:背景:23届末九三战失败,目标院校目标专业,超级gap大王语言:C++机考:我属于三天打鱼两天晒网的类型,所以备考期蛮久的,2月初机考,两道100分的题都是模拟类型,200分的题考了拓扑排序,机考是自己写输入输出综合测评:走流程,懂的都懂HR面:电话面试,面试官是非技术岗位的,问题比较轻松,主要是了解个人经历,没有为难技术面:两轮技术面安排在同一天,内容以八股文、手撕代码为主,项目问的蛮少,最后因为定级问题加面了一轮,三轮的手撕代码都是力扣中等难度,但都不是热门题,题号靠后,手撕代码是考官给你发一道题然后你打开屏幕共享在力扣或者自己的ide上完成主管面:没有涉及技术问题,主要是自我介绍、过往经历介绍以及个人情况说明总结:机考前的刷题阶段是最重要的,手撕代码的难度其实比机考要低,只要能过机试过手撕还是比较简单的;同时建议在刷题的同时认真准备一个项目,在github或者国内的网站上找一个跟着做也行,要求是能够清晰说出项目的实现和细节~~~~~~~~~~~~~我是分割线~~~~~~~~~~~~~现在考研也到尾声了,打算拿个保底offer的同学快来找海莉呀~全程保姆式护航毕业后2年内的gap都搞得定!
点赞 评论 收藏
分享
评论
2
31
分享

创作者周榜

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