IoC 的底层原理(简易版)

IoC 的底层原理

  • 读取配置文件,解析 XML。

  • 通过反射机制实例化配置文件中所配置的所有的bean。

    public class MyClassPathXmlApplicationContext implements MyApplicationContext {
           
        private Map<String,Object> ioc = new HashMap<>();
        public MyClassPathXmlApplicationContext(String path){
           
            SAXReader reder = new SAXReader();
            try {
           
                Document document = reder.read("src\\main\\resources\\"+path);
                Element root = document.getRootElement();
                Iterator<Element> iterator = root.elementIterator();
                while(iterator.hasNext()){
           
                    Element bean =  iterator.next();
                    String id = bean.attributeValue("id");
                    String aClass = bean.attributeValue("class");
                    //通过反射机制创建对象
                    Class clazz =  Class.forName(aClass);
                    //获取无参构造,创建目标对象
                    Constructor constructor = clazz.getConstructor();
                    Object object = constructor.newInstance();
                    //给目标对象赋值
                    Iterator<Element> beanIterator = bean.elementIterator();
                    while(beanIterator.hasNext()){
           
                        Element property = beanIterator.next();
                        String name = property.attributeValue("name");
                        String valueStr = property.attributeValue("value");
                        String ref = property.attributeValue("ref");
                        String methodName = "set"+name.substring(0,1).toUpperCase()+name.substring(1);
                        Field field = clazz.getDeclaredField(name);
                        Method method = clazz.getDeclaredMethod(methodName,field.getType());
                        //根据成员变量的数据类型将 value 的类型进行转换
                        Object value = null;
                        if(field.getType().getName() == "int"){
           
                            value = Integer.parseInt(valueStr);
                        }
                        if(field.getType().getName() == "java.lang.String"){
           
                            value = valueStr;
                        }
                        if(field.getType().getName() == "int"){
           
                            value = Integer.parseInt(valueStr);
                        }
                        method.invoke(object,value);
                    }
                    ioc.put(id,object);
                }
            } catch (DocumentException | ClassNotFoundException | NoSuchMethodException e) {
           
                e.printStackTrace();
            } catch (IllegalAccessException e) {
           
                e.printStackTrace();
            } catch (InstantiationException e) {
           
                e.printStackTrace();
            } catch (InvocationTargetException e) {
           
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
           
                e.printStackTrace();
            }
        }
    
        @Override
        public Object getBean(String id) {
           
            return ioc.get(id);
        }
    }
    

你可能感兴趣的:(Spring,框架)