java反射是实现自定义ioc容器依赖注入的核心,通过动态获取类结构、访问私有成员、调用构造器与setter方法完成bean扫描、实例化、字段注入及循环依赖处理。

Java 反射机制是实现自定义 IOC 容器依赖自动注入的核心技术基础。它让容器能在运行时动态获取类结构、访问私有字段、调用构造器和 setter 方法,从而绕过编译期绑定,完成对象创建与依赖装配。
扫描并加载 Bean 类型
容器启动时需识别哪些类应被管理(即标注了 @Component 或其衍生注解的类)。可通过 ClassLoader 加载指定包路径下的所有 .class 文件,再用反射解析其注解:
- 使用
ClassLoader.getResources("com/example/service/")获取资源路径 - 遍历字节码文件,用
Class.forName(className)加载类 - 调用
clazz.isAnnotationPresent(Component.class)判断是否为候选 Bean
通过反射实例化 Bean 对象
对符合条件的类,不直接 new,而是利用反射安全创建实例:
- 优先尝试无参构造器:
clazz.getDeclaredConstructor().newInstance() - 若无默认构造器,可查找唯一公共构造器并传入已解析的依赖参数(需递归解析其参数类型)
- 注意设置
constructor.setAccessible(true)绕过 private 限制
反射注入依赖字段(@Autowired)
对已创建的 Bean 实例,遍历其所有声明字段,按类型或名称匹配并注入依赖:
- 用
clazz.getDeclaredFields()获取全部字段(含 private) - 筛选标注
@Autowired的字段,检查其类型是否已在容器中注册(如 Map缓存) - 调用
field.setAccessible(true),再用field.set(beanInstance, dependency)完成赋值 - 若存在多个同类型 Bean,可结合
@Qualifier注解读取 value 值做名称匹配
处理循环依赖的简单策略
纯反射无法自动解决循环依赖,需配合“提前暴露半初始化对象”的三级缓存设计:
- 一级缓存(singletonObjects)存完全初始化好的 Bean
- 二级缓存(earlySingletonObjects)存已实例化但未注入依赖的对象(通过 ObjectFactory 提前提供)
- 三级缓存(singletonFactories)存创建该 Bean 的 lambda 工厂,避免重复创建
- 关键点:在调用
populateBean()(即反射注入阶段)前,先将原始对象放入二级缓存,供其他 Bean 注入引用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











