DI/IOC

2023-11-17

控制反转/依赖注入,主要说的是通过java的反射机制将xml文件解析,主动解释依赖关系,并实例化相关bean

package com.bjsxt.spring;





import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;


public class ClassPathXmlApplicationContext implements BeanFactory {

private Map<String , Object> beans = new HashMap<String, Object>();


//IOC Inverse of Control DI Dependency Injection
public ClassPathXmlApplicationContext() throws Exception {
SAXBuilder sb=new SAXBuilder();
   
   Document doc=sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); //构造文档对象
   Element root=doc.getRootElement(); //获取根元素HD
   List list=root.getChildren("bean");//取名字为disk的所有元素
   for(int i=0;i<list.size();i++){
      Element element=(Element)list.get(i);
      String id=element.getAttributeValue("id");
      String clazz=element.getAttributeValue("class");
      Object o = Class.forName(clazz).newInstance();
      System.out.println(id);
      System.out.println(clazz);
      beans.put(id, o);
      
      for(Element propertyElement : (List<Element>)element.getChildren("property")) {
      String name = propertyElement.getAttributeValue("name"); //userDAO
      String bean = propertyElement.getAttributeValue("bean"); //u
      Object beanObject = beans.get(bean);//UserDAOImpl instance
      
      String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
      System.out.println("method name = " + methodName);
      
      Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);
      m.invoke(o, beanObject);
      }
      
      
   }  
 
}






public Object getBean(String id) {
return beans.get(id);
}


}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DI/IOC 的相关文章

随机推荐