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);
                }
            }
    
        }
    
    }
    
    
  • 相关阅读:
    TinyEditor:简洁且易用的html所见即所得编辑器
    arguments.callee 调用自身
    java.io.IOException: 设备未就绪
    关于vcastr3播放器自动播放的问题
    javascript中IE浏览器不支持NEW DATE()带参数的解决方法
    Oracle常用查看表结构命令
    java通过文件头内容判断文件类型
    RS开发日期提示控件默认为昨天
    Cognos更新问题之利用Transform实现Cube增量更新
    SqlServer中从字符串中获取项目指标方法charindex月substring结合
  • 原文地址:https://www.cnblogs.com/caoleiCoding/p/9250233.html
Copyright © 2011-2022 走看看