# 1. 五种单例实现逐一写出并分析并发与序列化安全性(含枚举单例)? A 双重检查锁不需要 volatile B 枚举单例天然抵抗序列化与反射破坏 ✓ 正确答案 C 饿汉式是懒加载的 D 静态内部类不是线程安全的
# 2. 手写 Builder 模式,与构造器/静态工厂相比在可选参数与不可变对象上的优势如何? A Builder 无法保证线程安全 B Builder 构建的对象一定可变 C Builder 用于替代所有单参数构造器 D Builder 适合参数多、可选参数多的场景 ✓ 正确答案
# 3. 手写 Spring 风格 IOC,注解扫描、依赖注入与循环依赖处理如何? A 原型作用域也能解决循环依赖 B 构造器注入也能解决循环依赖 C 三级缓存用于在 Bean 创建期间暴露半成品引用 ✓ 正确答案 D 三级缓存可有可无
# 4. Spring 的单例 Bean 与 GoF 单例的本质区别,容器作用域、实例生命周期与多例(prototype)替代 A Spring 单例无法被 AOP 代理 B Spring 单例由类自身保证整个 JVM 唯一 C prototype 是容器内唯一的 D Spring 单例由容器管理,是容器作用域内的单例 ✓ 正确答案
# 5. 手写 JDK 动态代理与 CGLIB 代理,说明字节码生成的差异与限制? A JDK 动态代理要求目标实现接口 ✓ 正确答案 B CGLIB 可以代理 final 类 C JDK 代理基于继承生成子类 D CGLIB 不依赖字节码库
# 6. 手写一个简单 Spring 风格的依赖注入容器(注解扫描+构造注入)? A 容器扫描只看注解名不看包路径 B 构造注入不利于对象不可变性 C 构造注入把依赖作为构造器参数,保证对象创建即完整 ✓ 正确答案 D 构造注入比字段注入更难测试
# 7. 手写装饰器与责任链,与代理模式的本质区别,以及何时用装饰器而非继承? A 装饰器适合替代所有继承 B 装饰器必须只包一层 C 代理模式会改变目标接口 D 装饰器增强功能,代理控制访问 ✓ 正确答案
# 8. 手写模板方法 + 工厂方法的框架扩展点组合,与策略模式的区别如何? A 策略模式通过继承固定算法 B 模板方法通过继承固定骨架、子类实现扩展点 ✓ 正确答案 C 模板方法在运行时动态替换算法 D 策略模式必须有固定骨架
# 9. 手写事件总线(发布订阅 + 异步线程池),如何避免监听器异常影响其他订阅者? A 监听器无需捕获异常 B 一个监听器异常应中断整个发布 C 异步线程池必然造成异常传播 D 逐个 try-catch 并让每个监听器独立执行可隔离异常 ✓ 正确答案
# 10. 手写观察者模式,同步/异步通知、事件总线与内存泄漏(未解绑)如何取舍? A 观察者注册后无需解绑 B 异步通知一定比同步更实时 C 同步通知不会阻塞主题 D 观察者未解绑且主题长生命周期会导致内存泄漏 ✓ 正确答案
# 11. 手写 JDK 动态代理 vs CGLIB,接口代理与类代理的限制对比如何? A JDK 代理要求目标实现接口 ✓ 正确答案 B CGLIB 可以代理 final 方法 C JDK 代理基于继承生成子类 D CGLIB 可以代理静态方法
# 12. 手写原型模式,浅/深拷贝(clone/序列化/拷贝构造器)与注册表原型 A 浅拷贝复制引用对象的内容 B 深拷贝需要复制引用对象本身,不能只复制引用 ✓ 正确答案 C 序列化深拷贝性能最高 D clone 默认就是深拷贝
# 13. MyBatis/Feign 如何用 JDK 动态代理把接口变成可调用实现,MapperProxy 与 InvocationHandler 的角色 A MapperProxy 作为 InvocationHandler 把接口方法调用映射到 SQL/HTTP ✓ 正确答案 B Feign 接口必须有实现类 C 动态代理只能用于接口代理 D Mapper 方法是编译期生成 SQL
# 14. FactoryBean 与 @Bean 工厂方法,Spring 中工厂模式的两种实现、生命周期差异与典型用途 A @Bean 无法用于复杂对象创建 B @Bean 方法只能是静态方法 C FactoryBean 只能创建单例 D FactoryBean 通过 getObject() 创建目标对象,可用 & 前缀获取工厂本身 ✓ 正确答案
# 15. 手写策略+工厂,如何消除 if-else 分支并保持可扩展? A 工厂不能用于策略选择 B 新增策略必须修改原业务方法 C 策略模式需要 if-else 判断 D 工厂用 Map 按类型映射策略,新增策略只需注册 ✓ 正确答案
# 16. 手写适配器/外观,对接第三方库时如何隔离 API 变化,与代理的边界如何? A 外观用于实现代理 B 适配器控制访问但不改变接口 C 代理改变接口为兼容 D 适配器转换接口,代理控制访问 ✓ 正确答案
# 17. 手写简单工厂、工厂方法与抽象工厂,三种工厂的演进关系与各自适用边界如何? A 简单工厂天然符合开闭原则 B 工厂方法把创建延迟到子类,符合开闭原则 ✓ 正确答案 C 抽象工厂适合创建单一产品 D 工厂方法用于生产一族产品
# 18. 手写 JDK 动态代理,InvocationHandler 与 Proxy.newProxyInstance 的原理如何? A Proxy.newProxyInstance 不需要 ClassLoader B InvocationHandler 直接实现接口方法 C 代理类在运行期实现传入接口,方法调用转发到 InvocationHandler.invoke ✓ 正确答案 D 代理对象不能调用真实对象方法
# 19. 手写对象工厂的懒加载与缓存(Supplier + 双重检查) A 双重检查只需一次判空 B 第一层判空是为了防止指令重排 C volatile 用于保证每次创建新对象 D 双重检查 + volatile 保证懒加载且线程安全 ✓ 正确答案
# 20. InvocationHandler 的异常传播,目标方法抛出受检异常时动态代理如何处理,以及 UndeclaredThrowableException 的成因 A 所有受检异常都能原样传播 B 未在接口方法声明的受检异常会被包装成 UndeclaredThrowableException ✓ 正确答案 C UndeclaredThrowableException 是受检异常 D invoke 无需处理真实异常