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