当前位置: 代码迷 >> Java相关 >> spring依赖注入原理剖解
  详细解决方案

spring依赖注入原理剖解

热度:83   发布时间:2016-04-22 20:09:36.0
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

ItcastClassPathXMLApplicationContext.java

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 ItcastClassPathXMLApplicationContext(String filename){        this.readXML(filename);        this.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();            }        }            }    /**     * 读取xml配置文件     * @param filename     */    private void readXML(String filename) {           SAXReader saxReader = new SAXReader();               Document document=null;               try{             URL xmlpath = this.getClass().getClassLoader().getResource(filename);             document = saxReader.read(xmlpath);             Map<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);    }}
ItcastClassPathXMLApplicationContext

 

  相关解决方案