栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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);
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/712398.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号