• 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);
                }
            }
    
        }
    
    }
    
    
  • 相关阅读:
    Java实现 LeetCode 467 环绕字符串中唯一的子字符串
    Java实现 LeetCode 467 环绕字符串中唯一的子字符串
    从ramdisk根文件系统启动Linux成功
    linux中的设备名称和设备号
    设备与驱动的关系以及设备号、设备文件
    使用BusyBox制作Linux根文件系统
    使用Busybox-1.2.0制作根文件系统
    使用BusyBox制作根文件系统
    使用busybox制作rootfs
    uboot里读sd卡内容
  • 原文地址:https://www.cnblogs.com/caoleiCoding/p/9250233.html
Copyright © 2020-2023  润新知