spring源碼:IOC(li)

1、BeanDefinitionweb

  BeanDefinition是配置文件<bean>元素標籤在容器中內部表示形式。建立最終的BeanDefinition主要包括兩個步驟:
    1)利用BeanDefinitionReader對配置信息Resource進行讀取,經過XML解析器解析配置信息的DOM對象,簡單地爲每一個<bean>生成對應的BeanDefinition對象。可是這裏生成的BeanDefinition多是半成品,由於在配置文件中,咱們可能經過佔位符變量引用外部屬性文件的屬性,這些佔位符變量在這一步尚未被解析出來。
    2)利用容器中註冊的BeanFactoryPostProcessor對半成品的BeanDefinition進行加工處理,將以佔位符表示的配置解析爲最終的實際值,這樣半成品的BeanDefinition就爲成品的。spring

2、FactoryBean和BeanFactory編程

  一個是Factory,也就是IoC容器或對象工廠;一個是Bean。在Spring中,全部Bean都是由BeanFactory(也就是IoC容器)來進行管理的。但對FactoryBean而言,這個Bean不是簡單的Bean,而是一個能產生或者修飾對象生成的工廠Bean,它的實現與設計模式中的工廠模式和修飾器模式相似。BeanFactory接口設計了getBean方法,這個方法是使用IoC容器API的主要方法,Bean的取得是經過指定名字來進行索引的。設計模式

  BeanFactory繼承體系http://mydream1987.iteye.com/blog/1151380緩存

  AutowireCapableBeanFactory→AbstractAutowireCapableBeanFactory→DefaultListableBeanFactory→XmlBeanFactory IoC容器的實現系列。XmlBeanFactory這個IoC容器能夠讀取以XML形式定義的BeanDefinition。安全

@Deprecated
public class XmlBeanFactory extends DefaultListableBeanFactory {
 
    private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
 
    /**
     * Create a new XmlBeanFactory with the given resource,
     * which must be parsable using DOM.
     * @param resource XML resource to load bean definitions from
     * @throws BeansException in case of loading or parsing errors
     */
    public XmlBeanFactory(Resource resource) throws BeansException {
        this(resource, null);
    }
 
    /**
     * Create a new XmlBeanFactory with the given input stream,
     * which must be parsable using DOM.
     * @param resource XML resource to load bean definitions from
     * @param parentBeanFactory parent bean factory
     * @throws BeansException in case of loading or parsing errors
     */
    public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
        super(parentBeanFactory);
        this.reader.loadBeanDefinitions(resource);
    }
 
}

  編程式使用IOC容器:服務器

ClassPathResource res = new ClassPathResource("beans.xml");

DefaultListableBeanFactory factory = new DefaultListableBeanFactory();

XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);

reader.loadBeanDefinitions(res);

3、IOC容器初始化session

  IoC容器的初始化包括BeanDefinition的Resouce定位、載入和註冊這三個基本的過程。Spring容器的初始化主要分爲三個步驟,分別使Bean信息的定位,解析與註冊。以XML文件形式的Bean信息爲例,Spring首先找到XML文 件的位置,而後讀取此文件,而且將文件解析成相應的BeanDefinition,最後將獲取到的BeanDefinition註冊到BeanFactory中去。 併發

這副順序圖中咱們能夠看出,Spring容器的初始化過程主要由四個類來完成,咱們能夠參考下類的註釋以瞭解這幾個類的職責:框架

  1. XmlBeanDefinitionReader:用於XML Bean定義信息的BeanDefinitionReader,將事實上的XML文件讀取代理給BeanDefinitionDocumentReader接口的一個實現。
  2. BeanDefinitionDocumentReader:用於解析Spring Bean定義信息的服務提供接口(SPI),在實際解析DOM文檔的時候,由XmlBeanDefinitionReader來調用。
  3. BeanDefinitionParserDelegate:用於解析XML Bean定義信息的有狀態代理類。負責一個Bean的定義信息解析策劃可以BeanDefinition對象。
  4. BeanDefinitionRegistry:負責將獲得的Bean定義信息註冊到BeanFactory中。

4、Spring IOC實現

咱們須要從整體概念上對spring IOC有一個全局認識:

5、總述

 

  IOC-Inversion of Control,中文意爲控制反轉,將bean以內相互耦合的依賴關係交給框架來處理,bean的內部不須要再維護其所依賴bean的生命週期而更加關注自身的業務邏輯。spring IOC做爲IOC的一種實現,不只管理了各個bean的生命週期和依賴關係,還提供了豐富的擴展接口去動態的修改bean的行爲。

 

  bean的生命週期:從bean的建立、初始化、使用再到最終被銷燬,整個過程當中bean對象由框架來統一管理(除了prototype的bean在建立初始化後脫離了容器管理,由應用使用方本身來負責bean的銷燬回收)。

 

  bean的做用域:按照bean的做用範圍,bean的做用域分爲如下5種:singleton、prototype、request、session、global session。

 

  singleton爲單例bean的做用域,在容器中被建立後僅維持一份bean對象,建立後被緩存,任何請求該bean對象都是在這一個bean上進行操做,因此要注意線程安全問題,防止併發帶來的數據修改不一致問題。好比DAO層的某個bean會被多個service使用,這些bean能夠由同一個對象來代替,由於bean的數據源和行爲都是一致的。

 

  prototype爲原型bean的做用域,在任何被注入和容器中執行beanFactory.getBean()的時候,容器都會爲此類bean建立一個全新的對象供其餘對象使用。因爲不一樣對象中的bean是徹底不一樣的實例,因此它們之間互不影響,可是這樣一來系統開銷會比較大。

 

  在spring 2.0以前僅有單例和非單例兩種類型的bean做用域,到了2.0以後引入了request、http session和global session這三種做用域。

 

  request是針對web應用的http請求級別的bean做用域。HttpRequest就是一個很好的例子,request請求中包含用戶每次請求中的數據,每一次請求中傳輸的數據是不一樣的。

 

  http session是指bean生命週期貫穿一次完整的http會話過程。只要客戶端和web服務器之間的會話沒有斷開,session級別的bean對象就不會被銷燬。具體例子如HttpSession對象,不一樣的session容器會爲其建立不一樣的session對象。

 

6、

相關文章
相關標籤/搜索