天天看點

java-Sping-IOC

1.IoC容器建立

BeanFactory是一個最基本的接口規範,其中包含getBean,containsBean,getAliases等方法

Spring提供了一個BeanFactory的基本實作,XmlBeanFactory同樣的通過使用模闆模式來得到對IOC容器的抽象- 

AbstractBeanFactory,DefaultListableBeanFactory這些抽象類為其提供模闆服務。其中通過resource 接口來抽象bean定義資料,對Xml定義檔案的解析通過委托給XmlBeanDefinitionReader來完成。下面的例子,簡單的示範IOC容器的建立過程:

ClassPathResource res = new ClassPathResource("beans.xml");   
DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); 
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(res);
  
           

  

這些代碼示範了以下幾個步驟:   

    1. 建立IOC配置檔案的抽象資源     

  2. 建立一個BeanFactory  

    3. 把讀取配置資訊的BeanDefinitionReader,這裡是XmlBeanDefinitionReader配置給BeanFactory  

    4. 從定義好的資源位置讀入配置資訊,具體的解析過程由XmlBeanDefinitionReader來完成,這樣完成整個載入bean定義的過程。我們的IoC容器就建立起來了。

public class XmlBeanFactory extends DefaultListableBeanFactory {   
    //這裡為容器定義了一個預設使用的bean定義讀取器   
    private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);   
    public XmlBeanFactory(Resource resource) throws BeansException {   
         this(resource, null);   
   }   
    //在初始化函數中使用讀取器來對資源進行讀取,得到bean定義資訊。   
    public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {   
          super(parentBeanFactory);   
          this.reader.loadBeanDefinitions(resource);  
    }
           

備注( XmlBeanFactory[已廢棄] 和 ApplicationContext 是兩種IOC容器,其中實作的功能ApplicationContext 要多一點,BeanFactory往往不具備對資源定義的能力,而上下文可以自己完成資源定義)

2.ApplicationContext

仔細分析Spring BeanFactory的結構,我們來看看在BeanFactory基礎上擴充出的ApplicationContext - 我們最常使用的上下文。除了具備BeanFactory的全部能力,上下文為應用程式又增添了許多便利:   

      * 可以支援不同的資訊源,我們看到ApplicationContext擴充了MessageSource  

   * 通路資源 , 展現在對ResourceLoader和Resource的支援上面,這樣我們可以從不同地方得到bean定義資源     

   * 支援應用事件,繼承了接口ApplicationEventPublisher,這樣在上下文中引入了事件機制而BeanFactory是沒有的。

ApplicationContext提供IoC容器的主要接口,在其體系中有許多抽象子類比如AbstractApplicationContext為具體的BeanFactory的實作,比如FileSystemXmlApplicationContext和 ClassPathXmlApplicationContext提供上下文的模闆,使得他們隻需要關心具體的資源定

位問題。當應用程式代碼執行個體化 FileSystemXmlApplicationContext的時候,得到IoC容器的一種具體表現 - ApplicationContext,進而應用程式通過ApplicationContext來管理對bean的操作。 BeanFactory 是一個接口,在實際應用中我們一般使用ApplicationContext來使用IOC容器,它們也是IOC容器展現給應用開發者的使用接口。對應用程式開發者來說,可以認為BeanFactory和ApplicationFactory在不同的使用層面上代表了SPRING提供的IOC容器服務。 下面我們具體看看通過FileSystemXmlApplicationContext是怎樣建立起IOC容器的, 顯而易見我們可以通過new來得到IoC容器:

ApplicationContext = new FileSystemXmlApplicationContext(xmlPath);
           

調用的是它初始化代碼:

public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)   throws BeansException {   
     super(parent);   
     this.configLocations = configLocations;   
     if (refresh) {   
       //這裡是IoC容器的初始化過程,其初始化過程的大緻步驟由AbstractApplicationContext來定義   
        refresh();   
    }   
}


           

refresh的模闆在AbstractApplicationContext:

public void refresh() throws BeansException, IllegalStateException {  

    synchronized (this.startupShutdownMonitor) {    

       synchronized (this.activeMonitor) {        

         this.active = true;      

      }       

   // 這裡需要子類來協助完成資源位置定義,bean載入和向IOC容器注冊的過程         refreshBeanFactory();        

  ............  

 }  

  

這個方法包含了整個BeanFactory初始化的過程,對于特定的FileSystemXmlBeanFactory,我們看到定位資源位置由refreshBeanFactory()來實作:  

在AbstractXmlApplicationContext中定義了對資源的讀取過程,預設由XmlBeanDefinitionReader來讀取;

    * 初始化的入口在容器實作中的refresh()調用來完成  

    * 對bean 定義載入IOC容器使用的方法是loadBeanDefinition,其中的大緻過程如下:通過ResourceLoader來完成資源檔案位置的定位,DefaultResourceLoader是預設的實作,同時上下文本身就給出了ResourceLoader的實作,可以從類路徑,檔案系統, URL等方式來定為資源位置。如果是XmlBeanFactory作為IOC容器,那麼需要為它指定bean定義的資源,也就是說bean定義檔案時通過抽象成Resource來被IOC容器處理的,容器通過BeanDefinitionReader來完成定義資訊的解析和Bean資訊的注冊,往往使用的是XmlBeanDefinitionReader來解析bean的xml定義檔案 - 實際的處理過程是委托給BeanDefinitionParserDelegate來完成的,進而得到bean的定義資訊,這些資訊在Spring中使用BeanDefinition對象來表示 - 這個名字可以讓我們想到

loadBeanDefinition,RegisterBeanDefinition這些相關的方法 - 他們都是為處理BeanDefinitin服務的,IoC容器解析得到BeanDefinition以後,需要把它在IOC容器中注冊,這由IOC實作 BeanDefinitionRegistry接口來實作。注冊過程就是在IOC容器内部維護的一個HashMap來儲存得到的 BeanDefinition的過程。這個HashMap是IoC容器持有bean資訊的場所,以後對bean的操作都是圍繞這個HashMap來實作的。  

    * 然後我們就可以通過BeanFactory和ApplicationContext來享受到Spring IOC的服務了. 

  

轉載于:https://www.cnblogs.com/wonder2636/p/5541703.html