zoukankan      html  css  js  c++  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

    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
    肆虐的海水
  • 相关阅读:
    查看内置命令和非内置命令帮助的几种方法(man、help、info)
    手写js的insertAfter
    Java 单链表简单实现
    StudentMain控屏后如何关闭
    python3 twisted问题
    python3 you-get
    数据库方言(这是啥玩意儿?)
    vi/vim用法
    sublime text3
    数据库命令大全(也不是很全哈)
  • 原文地址:https://www.cnblogs.com/ckysea/p/4528653.html
Copyright © 2011-2022 走看看