只是对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{ //装载对象的集合 HashMapmap = 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); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)