1. 程式人生 > >自定義Java web框架(三)

自定義Java web框架(三)

接續上一篇文章自定義Java web框架(二) 本章內容主要是講解如何實現IOC功能。 所謂的IOC,控制反轉,bean的例項化通過框架自身來實現,也叫依賴注入。平時我們自己程式設計的例項化,都是通過new的方式實現,IOC把這個過程交給框架去處理,不需要手動程式設計。 實現思路如下: 先獲取所有的Bean Map,然後遍歷這個map容器,分別取出Bean類與Bean例項,進而通過反射獲取類中所有的成員變數,繼續遍歷這些成員變數,在迴圈中判斷當前成員變數是否有Inject註解,若帶有該註解,則從Bean Map中根據Bean類取出Bean例項,最後通過ReflectionUtil#setField方法來修改當前成員變數的值。

核心類的程式碼如下:

public class IocHelper {

    static {
        //獲取所有的Bean類與Bean例項之間的對映關係(簡稱BeanMap)
        Map<Class<?>, Object> beanMap = BeanHelper.getBeanMap();
        if (CollectionUtil.isNotEmpty(beanMap)) {
            //遍歷BeanMap
            for (Map.Entry<Class<?>, Object> beanEntry : beanMap.entrySet()) {
                //從BeanMap中獲取Bean類與Bean例項
                Class<?> beanClass = beanEntry.getKey();
                Object beanInstance = beanEntry.getValue();
                //獲取Bean類定義的所有成員變數(簡稱Bean Field)
                Field[] beanFields = beanClass.getDeclaredFields();
                if (ArrayUtil.isNotEmpty(beanFields)) {
                    //遍歷Bean Field
                    for (Field beanField : beanFields) {
                        //判斷當前Bean Field 是否帶有Inject註解
                        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);
                            }
                        }
                    }
                }
            }
        }
    }

其中用到陣列的非空判斷,工具類如下:

public class ArrayUtil {
    /**
     * 判斷陣列是否非空
     * @param array
     * @return
     */
    public static boolean isNotEmpty(Object[] array) {
        return !ArrayUtils.isEmpty(array);
    }

    /**
     * 判斷陣列是否為空
     * @param array
     * @return
     */
    public static boolean isEmpty(Object[] array) {
        return ArrayUtil.isEmpty(array);
    }
}

程式碼地址如果本文對您有幫助, 動動小手給個star。