【从零写javaweb框架】(五)实现依赖注入功能

上一篇我们写了一个方便反射的工具类ReflectionUtil,和一个用来实例化和保存Bean的容器BeanHelper。

【从零写javaweb框架】(四)实现Bean容器

经过前几篇的积累,我们现在终于可以写依赖注入的功能了,一个简单的IOC并不难实现。

先简单介绍一下IOC(Inversion of Control,控制反转),意思是实例化过程并不是由开发者用new的方式来实例化,而是由框架自己来实例化。一般地,我们也将控制反转成为DI(Dependency Injection,依赖注入),可以理解为将某个类需要依赖的成员注入到这个类中。


以下步骤均在框架项目中进行

现在,正式开始编写一个IocHelper类,让它来实现依赖注入:

package org.smart4j.framework.helper;

import org.smart4j.framework.annotation.Inject;
import org.smart4j.framework.util.ArrayUtil;
import org.smart4j.framework.util.CollectionUtil;
import org.smart4j.framework.util.ReflectionUtil;

import java.lang.reflect.Field;
import java.util.Map;

/**
 * desc : 依赖注入助手类
 * Created by Lon on 2018/1/25.
 */
public final class IocHelper {

    static {
        //将Bean实例化完成之后的BeanMap取出
        Map<Class<?>, Object> beanMap = BeanHelper.getBeanMap();
        if (CollectionUtil.isNotEmpty(beanMap)){
            //遍历BeanMap
            for (Map.Entry<Class<?>, Object> beanEntry : beanMap.entrySet()){
                //获取Bean类与Bean实例
                Class<?> beanClass = beanEntry.getKey();
                Object beanInstance = beanEntry.getValue();
                //获取Bean类定义的所有成员变量
                Field[] beanFields = beanClass.getDeclaredFields();
                if (ArrayUtil.isNotEmpty(beanFields)){
                    //遍历Bean Field
                    for (Field beanField : beanFields){
                        if (beanField.isAnnotationPresent(Inject.class)){
                            //在Bean Map中获取Bean Field对应的实例
                            Class<?> beanFieldClass = beanField.getType();
                            Object beanFieldInstance = beanMap.get(beanFieldClass);
                            if (beanFieldInstance != null){
                                // 通过反射初始化BeanField的值
                                ReflectionUtil.setField(beanInstance, beanField, beanFieldInstance);
                            }
                        }
                    }
                }
            }
        }
    }

}


可以看到,我们还用到了一个ArrayUtil来检验数组是否为非空,其实实现很简单:

package org.smart4j.framework.util;

import org.apache.commons.lang3.ArrayUtils;

/**
 * desc : 数组工具类
 * Created by Lon on 2018/1/25.
 */
public final class ArrayUtil {

    /**
     * 判断数组是否非空
     */
    public static boolean isNotEmpty(Object[] array){
        return !ArrayUtils.isEmpty(array);
    }

    /**
     * 判断数组是否为空
     */
    public static boolean isEmpty(Object[] array){
        return !ArrayUtils.isEmpty(array);
    }

}

照旧发一张当前框架项目的结构图:



总结:

本章写了一个IocHelper来实现依赖注入,另外写了一个ArrayUtil工具类。依赖注入并没有我想象中的那么难,知道原理,可以在此基础上写出更强大的功能。

下一篇文章会写:加载Controller

【从零写javaweb框架】(六)加载Controller


猜你喜欢

转载自blog.csdn.net/u013295276/article/details/79167569