Java反射为Spring等框架实现基于配置的依赖注入提供底层能力:解析配置获取类名与属性元信息,再用反射创建实例、设值及调用方法。

Java 反射本身不直接实现配置加载,但它为 Spring 等框架实现“基于配置的依赖注入”提供了底层能力。Spring 的配置加载(如 XML 或 @Configuration 类)本质是:先解析配置 → 得到类名、属性名、值等元信息 → 再用反射动态创建实例、设值、调用方法。
1. 从配置中提取类与属性信息
你可以用简单 JSON 或 properties 模拟 Spring 的 bean 定义:
{
"beans": [
{
"id": "userService",
"class": "com.example.UserService",
"properties": [
{ "name": "userDao", "ref": "userDao" }
]
},
{
"id": "userDao",
"class": "com.example.UserDao"
}
]
}
解析后得到 BeanDefinition 对象,包含 className、beanId、propertyMap(属性名 → 引用名或字面值)。
2. 用反射创建实例并缓存单例
遍历 BeanDefinition,按依赖顺序(需拓扑排序)实例化:
立即学习“Java免费学习笔记(深入)”;
- 通过 Class.forName(className).getDeclaredConstructor().newInstance() 创建对象
- 对非基本类型属性,先递归获取依赖 bean;对字符串/数字等字面值,用 PropertyEditor 或简单转换(如 Integer.parseInt)
- 用 Field.setAccessible(true) 跳过访问控制,再调用 field.set(instance, value)
- 将已创建的 bean 放入 ConcurrentHashMap 缓存,避免重复创建
3. 支持 setter 注入与构造器注入
不只是 setXxx,还可支持更贴近 Spring 的方式:
- Setter 注入:扫描 public void setXXX(Type) 方法,匹配 property name(去掉 set,首字母小写)
- 构造器注入:读取配置中 constructor-arg,用 Class.getConstructor(Class...) → newInstance(args)
- 若配置含 autowire="byType",则遍历所有已创建 bean,找类型匹配的字段自动赋值
4. 加载时机与扩展点
类似 ApplicationContext,可设计一个简易容器:
- 构造时传入配置路径,内部触发解析 + 反射初始化
- 提供 getBean(String id),返回代理或原始对象
- 预留扩展:在实例化前后加入 BeanPostProcessor 接口(用反射调用 before/after 方法)
- 支持注解驱动?可配合 Class.getDeclaredAnnotations() + Field.getAnnotations() 实现 @Autowired 简易版
不复杂但容易忽略:反射性能开销可通过缓存 Constructor/Method/Field 对象来优化;安全限制(如模块系统、SecurityManager)需提前处理;类型转换和循环依赖需额外逻辑支撑。


















