你的位置:首页 > Java教程

[Java教程]spring依赖注入原理剖析


PropertyDefinition.java

 1 package junit.test; 2  3 public class PropertyDefinition { 4   private String name; 5   private String ref; 6    7   public PropertyDefinition(String name, String ref) { 8     this.name = name; 9     this.ref = ref;10   }11   12   public String getName() {13     return name;14   }15   public void setName(String name) {16     this.name = name;17   }18   public String getRef() {19     return ref;20   }21   public void setRef(String ref) {22     this.ref = ref;23   }24   25 }

PropertyDefinition

BeanDefinition.java

 1 package junit.test; 2  3 import java.util.ArrayList; 4 import java.util.List; 5  6 public class BeanDefinition { 7   private String id; 8   private String className; 9   private List<PropertyDefinition> propertys = new ArrayList<PropertyDefinition>();10   11   public BeanDefinition(String id, String className) {12     this.id = id;13     this.className = className;14   }15   public String getId() {16     return id;17   }18   public void setId(String id) {19     this.id = id;20   }21   public String getClassName() {22     return className;23   }24   public void setClassName(String className) {25     this.className = className;26   }27   public List<PropertyDefinition> getPropertys() {28     return propertys;29   }30   public void setPropertys(List<PropertyDefinition> propertys) {31     this.propertys = propertys;32   }33   34 }

BeanDefinition

ItcastClassPath

package junit.test;import java.beans.IntrospectionException;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.Method;import java.net.URL;import java.util.ArrayList;import java.util.HashMap;import java.util.HashSet;import java.util.List;import java.util.Map;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.XPath;import org.dom4j.io.SAXReader;/** * 传智传客版容器 * */public class a {  private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();  private Map<String, Object> sigletons = new HashMap<String, Object>();    public ItcastClassPaththis.readthis.instanceBeans();    this.injectObject();  }  /**   * 为bean对象的属性注入值   */  private void injectObject() {    for(BeanDefinition beanDefinition : beanDefines){      Object bean = sigletons.get(beanDefinition.getId());      if(bean!=null){        try {          PropertyDescriptor[] ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();          for(PropertyDefinition propertyDefinition : beanDefinition.getPropertys()){            for(PropertyDescriptor properdesc : ps){              if(propertyDefinition.getName().equals(properdesc.getName())){                Method setter = properdesc.getWriteMethod();//获取属性的setter方法 ,private                if(setter!=null){                  Object value = sigletons.get(propertyDefinition.getRef());                  setter.setAccessible(true);                  setter.invoke(bean, value);//把引用对象注入到属性                }                break;              }            }          }        } catch (Exception e) {        }      }    }  }  /**   * 完成bean的实例化   */  private void instanceBeans() {    for(BeanDefinition beanDefinition : beanDefines){      try {        if(beanDefinition.getClassName()!=null && !"".equals(beanDefinition.getClassName().trim()))          sigletons.put(beanDefinition.getId(), Class.forName(beanDefinition.getClassName()).newInstance());      } catch (Exception e) {        e.printStackTrace();      }    }      }  /**   * 读取@param filename   */  private void read= new SAXReader();        Document document=null;        try{       URL = this.getClass().getClassLoader().getResource(filename);       document = saxReader.read(<String,String> nsMap = new HashMap<String,String>();       nsMap.put("ns","http://www.springframework.org/schema/beans");//加入命名空间       XPath xsub = document.createXPath("//ns:beans/ns:bean");//创建beans/bean查询路径       xsub.setNamespaceURIs(nsMap);//设置命名空间       List<Element> beans = xsub.selectNodes(document);//获取文档下所有bean节点        for(Element element: beans){        String id = element.attributeValue("id");//获取id属性值        String clazz = element.attributeValue("class"); //获取class属性值            BeanDefinition beanDefine = new BeanDefinition(id, clazz);        XPath propertysub = element.createXPath("ns:property");        propertysub.setNamespaceURIs(nsMap);//设置命名空间        List<Element> propertys = propertysub.selectNodes(element);        for(Element property : propertys){                    String propertyName = property.attributeValue("name");          String propertyref = property.attributeValue("ref");          PropertyDefinition propertyDefinition = new PropertyDefinition(propertyName, propertyref);          beanDefine.getPropertys().add(propertyDefinition);        }        beanDefines.add(beanDefine);       }       }catch(Exception e){          e.printStackTrace();      }  }  /**   * 获取bean实例   * @param beanName   * @return   */  public Object getBean(String beanName){    return this.sigletons.get(beanName);  }}

ItcastClassPath