zoukankan      html  css  js  c++  java
  • Spring基本原理模拟(IoC部分)

    package ioc;
    
    import java.io.File;
    import java.lang.reflect.Method;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    public class MyXmlApplicationContext implements ApplicationContext {
        private Map<String, Object> objectPool = Collections
                .synchronizedMap(new HashMap<String, Object>());
        private Document doc;
        private Element root;
    
        public MyXmlApplicationContext(String filePath) throws Exception {
            SAXReader reader = new SAXReader();
            doc = reader.read(new File(filePath));
            root = doc.getRootElement();
            intitPool();
            intitProp();
        }
    
        @Override
        public Object getBean(String name) throws Exception {
            Object target = objectPool.get(name);
            if (target.getClass() != String.class) {
                return target;
            } else {
                String clazz = (String) target;
                return Class.forName(clazz).newInstance();
            }
        }
    
        private void intitProp() throws Exception {
            for (Object obj : root.elements()) {
                Element beanEle = (Element) obj;
                String beanId = beanEle.attributeValue("id");
                String beanScope = beanEle.attributeValue("scope");
                if (beanScope == null || beanScope.equals("singleton")) {
                    Object bean = objectPool.get(beanId);
                    for (Object prop : beanEle.elements()) {
                        Element propEle = (Element) prop;
                        String propName = propEle.attributeValue("name");
                        String propValue = propEle.attributeValue("value");
                        String propRef = propEle.attributeValue("ref");
                        String propNameCamlize = propName.substring(0, 1)
                                .toUpperCase()
                                + propName.substring(1, propName.length());
                        if (propValue != null && propValue.length() > 0) {
                            Method setter = bean.getClass().getMethod(
                                    "set" + propNameCamlize, String.class);
                            setter.invoke(bean, propValue);
                        }
                        if (propRef != null && propRef.length() > 0) {
                            Object target = objectPool.get(propRef);
                            if (target == null) {
    
                            }
    
                            Method setter = null;
                            for (Class<?> superInteface : target.getClass()
                                    .getInterfaces()) {
                                try {
                                    setter = bean.getClass().getMethod(
                                            "set" + propNameCamlize, superInteface);
                                    break;
                                } catch (NoSuchMethodException ex) {
                                    continue;
                                }
                            }
                            if (setter == null) {
                                setter = bean.getClass().getMethod(
                                        "set" + propNameCamlize, target.getClass());
                            }
                            setter.invoke(bean, target);
                        }
                    }
                }
    
            }
    
        }
    
        private void intitPool() throws Exception {
            for (Object obj : root.elements()) {
                Element beanEle = (Element) obj;
                String beanId = beanEle.attributeValue("id");
                String beanClass = beanEle.attributeValue("class");
                String beanScope = beanEle.attributeValue("scope");
                if (beanScope == null || beanScope.equals("singleton")) {
                    objectPool.put(beanId, Class.forName(beanClass).newInstance());
                } else {
                    objectPool.put(beanId, beanClass);
                }
            }
    
        }
    
    }
    
    
  • 相关阅读:
    CentOS 5.5 安装 Oracle 11gR2 并随系统启动
    使用blockrecover 对有坏块的数据文件进行恢复
    用yum下载安装包
    PInvoke时候StringBuilder的陷阱
    mac:添加环境变量
    win8:metro app UI 设计
    用户体验&UI 实用小技巧
    Win8:To Do List Demo
    JavaScript语言精粹 ——笔记
    win8: 确保 WinJS.xhr 重新发送请求
  • 原文地址:https://www.cnblogs.com/caoleiCoding/p/9250233.html
Copyright © 2011-2022 走看看