面灵AI→

字节 AI 应用开发一面:Spring 代理、反射可见性与幻读

轮次
一面
时间
2026-10
来源
牛客网

《面试题目》

  1. 自我介绍。
  2. 聊一下实习经历。
  3. @Resource 和 @Autowired 有什么区别?除了 Bean 的匹配方式不同,它们支持的注入方式还有哪些差异?
  4. 事务注解加在接口实现类的方法上,和加在普通类的方法上,有什么区别?
  5. 如果同时存在 @Value 或自定义配置注解,通过反射扫描、初始化这些注解,与事务代理共存时会出现什么问题?接口实现类和普通类是否有差异?
  6. JDK 动态代理对象和继承目标类的代理子类,在通过反射访问成员方法、成员属性及其注解时,可见性上有什么区别?
  7. MySQL InnoDB 默认的事务隔离级别是什么?
  8. 可重复读隔离级别能解决幻读问题吗?
  9. 有哪些手段可以规避幻读?
  10. 如果要防止插入型幻读,需要加什么类型的锁?
  11. 只加行锁能不能防止幻读?为什么?
  12. 你怎么理解幻读?它是如何发生的?
  13. 实习或日常开发中用过哪些 AI 编程工具?具体怎么用?
  14. 编程题:将二进制字符串变为单调递增所需的最小翻转次数,先讲解题思路。

《参考解析》

@Autowired 按类型注入(默认 required),@Resource 按名称注入、找不到再按类型;@Autowired 支持构造器、setter、字段注入并可与 @Qualifier 组合,@Resource 主要用于字段和 setter。前者是 Spring 的注解,后者是 JSR-250 标准。

事务注解加在实现类方法上才生效,因为 Spring AOP 默认基于接口的 JDK 动态代理,注解在接口方法上时代理能读到,但更常见的问题是「自调用」——同类内部方法调用不走代理,事务失效。加在普通类上(非接口)会用 CGLIB 生成子类代理。

反射与事务代理共存的问题:代理对象上的注解可能拿不到原始类上的注解,因为注解不在代理类上;需要通过 AopUtils.getTargetClass 或 AnnotationUtils.findAnnotation 找到目标类。JDK 动态代理只能访问接口方法,CGLIB 子类能访问 public/protected 方法,private 方法代理不到。

RR 下 MVCC 解决的是快照读的幻读,当前读仍可能幻读。InnoDB 用 Next-Key Lock(记录锁 + 间隙锁)锁住范围阻止插入;只加行锁挡不住「插入新行」,因为新行不在已有记录上。

最小翻转次数:目标是让二进制字符串单调不降(所有 0 在前、1 在后)。枚举分界点,把分界点左边的 1 翻成 0、右边的 0 翻成 1,取最小值;预处理前缀 1 的个数和后缀 0 的个数即可 O(n)。