自定義Java web框架(三)
阿新 • • 發佈:2018-12-17
接續上一篇文章自定義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。