spring ioc 控制反轉底層

package com.dzu.ioc;


import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;


import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;


public class ClassPathXmlApplicationContext implements ApplicationContext {
    private Map<String,Object> ioc = new HashMap<>();
//    構造方法
    public  ClassPathXmlApplicationContext(String path) throws DocumentException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
//        解析xml的對象SAXReader
        SAXReader reader = new SAXReader();
        Document document = reader.read(path);
//        獲取文件頭
        Element root = document.getRootElement();
//        使用迭代器
        Iterator<Element> iterator = root.elementIterator();
        while (iterator.hasNext()){
            Element element = iterator.next();
            String id = element.attributeValue("id");
            String className = element.attributeValue("class");
//            System.out.println(id);
//            System.out.println(className);
//            通過反射機制創建對象
            Class clazz = Class.forName(className);
//            獲取無參構造函數,創建目標對象
            Constructor constructor = clazz.getConstructor();
//            System.out.println(constructor);
//            利用無參構造函數 構造一個(空的)對象
            Object obj = constructor.newInstance();
//            System.out.println(obj);
            Iterator<Element> baenIter = element.elementIterator();
            while (baenIter.hasNext()){
                Element property = baenIter.next();
                String name = property.attributeValue("name");
                String valueStr = property.attributeValue("value");
//                System.out.println(name+":"+valueStr);
//                獲取set方法的名字
                String methodName = "set"+name.substring(0,1).toUpperCase()+name.substring(1);
//                System.out.println(methodName);
//                獲取字段的類型
                Field field = clazz.getDeclaredField(name);
//                獲取真正的set方法
                Method method = clazz.getDeclaredMethod(methodName,field.getType());
                Object value = null;
                if (field.getType().getName() == "java.lang.Integer"){
                    value = Integer.parseInt(valueStr);
                }
                if (field.getType().getName() == "java.lang.String"){
                    value = valueStr;
                }
//                裝載set方法
                method.invoke(obj,value);
                System.out.println(method);
            }
//            將對象裝載入ioc map
            ioc.put(id,obj);
        }
    }

    @Override
    public Object getBean(String id) {
        return ioc.get(id);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章