动手写web框架(4): 依赖注入实现

IOC的原理参见:IOC原理

对象交给第三方容器管理,维护对象间的关系,并将依赖的成员注入到相关的对象中。

BeanHelper已经可以获取到所有Bean对象,现在就需要遍历这些Bean对象,通过反射获取对象的成员变量,判断成员变量是否带有@Inject注解,如果有就通过反射注入相关的Bean对象。

IocHelper
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package org.smart4j.framework.helper;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.smart4j.framework.annotation.Inject;
import org.smart4j.framework.util.ReflectionUtil;
import java.lang.reflect.Field;
import java.util.Map;
/**
* 实现依赖注入功能
* Created by Roger on 2016/11/23.
*/
public final class IocHelper {
static {
Map<Class<?>, Object> beanMap = BeanHelper.getBeanMap();
if (MapUtils.isNotEmpty(beanMap)){
for (Map.Entry<Class<?>, Object> beanEntry: beanMap.entrySet()){
Class<?> beanCls = beanEntry.getKey();
Object beanInstance = beanEntry.getValue();
// 获取bean类定义的所有成员变量
Field[] beanFields = beanCls.getDeclaredFields();
if (ArrayUtils.isNotEmpty(beanFields)){
for (Field field: beanFields){
if (field.isAnnotationPresent(Inject.class)){
// 在Bean Map中获取Bean Field对应的实例
Class<?> beanFieldCls = field.getType();
Object beanFieldInstance = beanMap.get(beanFieldCls);
if (beanFieldInstance != null){
// 通过反射初始化Field值
ReflectionUtil.setField(beanInstance, field, beanFieldInstance);
}
}
}
}
}
}
}
}