Ioc的简单实现(bean、依赖注入控制等)

Ioc的简单实现(bean、依赖注入控制等),第1张

Ioc的简单实现(bean、依赖注入控制等)

只是对IOC的简单原理进行了实现,略显简陋;

import org.dom4j.document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.SAXWriter;
import org.xml.sax.SAXException;

import java.beans.PropertyDescriptor;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;

public class ClassPathXmlApplicationContext_run implements ApplicationContext{
    //装载对象的集合
    HashMap map = new HashMap<>();
    //构造方法
    public ClassPathXmlApplicationContext_run(String xmlPath) throws Exception {
        
        //解析ClassPathXmlApplicationContext.xml文件-变成流
        InputStream in = ClassPathXmlApplicationContext.class.getClassLoader().getResourceAsStream(xmlPath);
        //解析器
        SAXReader saxReader = new SAXReader();
        //解析数据流,获取标签root
        document read = saxReader.read(in);
        Element root = read.getRootElement();
        //根据根标签获取指定标签集合beans
        List beans = root.elements("bean");
        for (Element bean:beans) {
            
            //获取每个bean标签的id和class(全限定名)
            String beanclass = bean.attributevalue("class");
            String id = bean.attributevalue("id");
            //通过反射获取对象
            Class aClass = Class.forName(beanclass);
            Object obj = aClass.newInstance();
            map.put(id,obj);
            
            //获取所有property的依赖标签---还有其他的可以根据这个思路展开
            List elements = bean.elements("property");
            for (Element e:elements) {
                //获得数据
                String name = e.attributevalue("name");
                String ref = e.attributevalue("ref");
                String value = e.attributevalue("value");
                if(ref!=null){
                    //这个依赖是对象
                    Object o = map.get(name);
                    //通过反射内省获取属性描述器:就是accountDao属性的getset方法结合体
                    PropertyDescriptor propertyDescriptor = new PropertyDescriptor(name, aClass);
                    Method method = propertyDescriptor.getWriteMethod();//setAccount(AccountDao o);
                    //执行set方法添加
                    method.invoke(obj,o);
                }else {
                    //普通类型
                    PropertyDescriptor propertyDescriptor = new PropertyDescriptor(name, aClass);
                    Method method = propertyDescriptor.getWriteMethod();//setAccount(AccountDao o);
                    method.invoke(obj,value);
                }
            }
        }
    }

    @Override
    public Object getBean(String id) {
        return map.get(id);
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5709049.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存