spring源碼--依賴注入

XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(new ResourceLoader());
        xmlBeanDefinitionReader.loadBeanDefinitions("tinyioc.xml");node

一、先加載Resource 對象,獲取XmlBeanDefinitionReader 對象。而後調用loadBeanDefinitions方法加載spring配置文件
加載過程:
(1)先將配置文件經過getResourceLoader().getResource(location).getInputStream(); 加載到流中git

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = factory.newDocumentBuilder();
        Document doc = docBuilder.parse(inputStream);
(2)而後經過以上方法,將流中的內容 轉換成Document對象,Element root = doc.getDocumentElement();
再將doc 轉換成Element對象(該對象是xml對應標籤的實例)spring

(3)NodeList nl = root.getChildNodes();
        for (int i = 0; i < nl.getLength(); i++) {
            Node node = nl.item(i);
            if (node instanceof Element) {
                Element ele = (Element) node;
                processBeanDefinition(ele);
            }
        }
將Element對象轉換成NodeList對象,遍歷bean標籤。獲取指定bean標籤中的id 和classui

String name = ele.getAttribute("id");
        String className = ele.getAttribute("class");
        BeanDefinition beanDefinition = new BeanDefinition();
        processProperty(ele, beanDefinition);
        beanDefinition.setBeanClassName(className);
        getRegistry().put(name, beanDefinition);xml

(4)獲取到的bean標籤對應的name 和className,並將className 封裝進BeanDefinition,並將name 和BeanDefinition
封裝到XmlBeanDefinitionReader  的map屬性中,用於之後的遍歷和使用,對象

若是該bean對象,若是還有依賴的屬性,仍是須要將依賴的屬性  封裝進BeanDefinition的PropertyValues屬性中,若是有ref注入
那麼還須要獲取到ref的value 並封裝進BeanReference 並將其封裝到beanDefinition 的PropertyValues中get

BeanDefinition 對象屬性有
private Object bean;input

    private Class beanClass;源碼

    private String beanClassName;//存放 class 對應的包名.類名it

    private PropertyValues propertyValues = new PropertyValues();//包裝一個bean 須要的全部屬性和value


以上,就完成了bean 的配置文件的讀取和注入的準備工做


二、xmlBeanDefinitionReader  對map屬性進行遍歷  ,初始化BeanFactory並註冊bean
AbstractBeanFactory beanFactory = new AutowireCapableBeanFactory();
AbstractBeanFactory 是可自動裝配內容的BeanFactory

AbstractBeanFactory beanFactory = new AutowireCapableBeanFactory();
for (Map.Entry<String, BeanDefinition> beanDefinitionEntry : xmlBeanDefinitionReader.getRegistry().entrySet()) {
            beanFactory.registerBeanDefinition(beanDefinitionEntry.getKey(), beanDefinitionEntry.getValue());
}

registerBeanDefinition 方法中 將 bean 的name  和對應的BeanDefinition 對象封裝到AbstractBeanFactory的map中
並檢查對應的bean 是否 存在,若是不存在,就create一個bean,並將這個新建立的bean存放到BeanDefinition 屬性bean
中,下次調用的時候,直接獲取,再getBean 時,直接根據name return返回指定名稱的bean,而後強轉到指定類型便可。

 

以上源碼,來自git-Hub上的tiny-spring 項目

相關文章
相關標籤/搜索