依赖注入,也称为控制反转,不是由开发者new一个对象,而是将对象的生成,交给框架来完成,将控制权反转给框架。依然可以理解为,将某个类A所需要的成员变量(某个类B引用)注入到这个类A中。了解了类的加载之后,就可以创建实例,进而通过反射技术,将需要注入的类赋给某个类。
类的实例化:
public static Object newInstance(Class<?> cls) {
Object instance;
try {
instance = cls.newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
return instance;
}
实例化类之后,可以将类与实例化对象放置一容器中,需要注入时可从容器中直接获取该对象。
private static final Map<Class<?>, Object> BEAN_MAP = new HashMap<Class<?>, Object>();
static {
Set<Class<?>> beanClassSet = ClassHelper.getBeanClassSet();
for (Class<?> beanClass : beanClassSet) {
Object obj = newInstance(beanClass);
BEAN_MAP.put(beanClass, obj);
}
}
类的加载与对象实例化完成后,就可以根据实际,将某一类B的实例,注入到类A中,完成依赖注入:
public final class IocHelper {
static {
Map<Class<?>, Object> beanMap = BeanHelper.getBeanMap();
if (CollectionUtil.isNotEmpty(beanMap)) {
for (Map.Entry<Class<?>, Object> beanEntry : beanMap.entrySet()) {
Class<?> beanClass = beanEntry.getKey();
Object beanInstance = beanEntry.getValue();
Field[] beanFields = beanClass.getDeclaredFields();
if (ArrayUtil.isNotEmpty(beanFields)) {
for (Field beanField : beanFields) {
if (beanField.isAnnotationPresent(Resource.class)) { //以@Resource为例
Class<?> beanFieldClass = beanField.getType();
Object beanFieldInstance = beanMap.get(beanFieldClass);
if (beanFieldInstance != null) {
setField(beanInstance, beanField, beanFieldInstance);
}
}
}
}
}
}
}
}
给成员变量赋值:
/**
* 设置成员变量的值
*/
public static void setField(Object obj, Field field, Object value) {
try {
field.setAccessible(true);
field.set(obj, value);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
如此就完成了,依赖注入功能