Spring IoC 容器詳解 [Spring][IoC 控制反轉][BeanFactory][ApplicationContext]

您的“關注”和“點贊”,是信任,是認可,是支持,是動力…

如意見相佐,可留言。
本人必將竭盡全力試圖做到準確和全面,終其一生進行修改補充更新。

1 Spring IoC 概述

Spring IoC,全稱 Spring Inversion of Control ,控制反轉。

IoC(控制反轉) 是指在程序開發中,實例的創建不再由調用者管理,而是由 Spring 容器創建。Spring 容器會負責控制程序之間的關係,而不是由程序代碼直接控制,因此,控制權由程序代碼轉移到了 Spring 容器中,控制權發生了反轉,這就是 Spring 的 IoC 思想。

簡單理解,IoC(控制反轉)就是控制權的轉移,即把創建(new)對象的權利,反轉給第三方Spring 框架去創建(new)。也就是把對象的創建的權利及對象的生命週期的管理過程交由Spring 框架來處理,從此在開發過程中不再需要關注對象的創建和生命週期的管理,而是在需要時由 Spring 框架提供,這個由 Spring 框架管理對象創建和生命週期的機制稱之爲控制反轉。而 Spring 容器在創建被調用者的實例時,會自動將調用者需要的對象實例注入給調用者,這樣,調用者通過 Spring 容器獲得被調用者實例,這稱爲依賴注入,也即 DI (《Spring 依賴注入詳解》)。

示意如下所示:

# 以前

User user = new User();  // 由程序員控制 new 對象
# 現在:

現在 Spring 容器來創建對象
User user = spring容器.get對象("容器中的唯一對象Id");

2 Spring 提供兩種 IoC 容器

2.1 BeanFactory

BeanFactory 是基礎類型的 IoC 容器,它由 org.springframework.beans.facytory.BeanFactory 接口定義,並提供了完整的 IoC 服務支持。

簡單理解,BeanFactory 就是一個管理 Bean 的工廠,它主要負責初始化各種 Bean,並調用它們的生命週期方法。

BeanFactory 接口有多個實現類,最常見的如下所示:

  • org.springframework.beans.factory.xml.XmlBeanFactory:它是根據 XML 配置文件中的定義裝配 Bean 的。

創建 BeanFactory 實例時,需要提供 Spring 所管理容器的詳細配置信息,這些信息通常採用 XML 文件形式管理。

其加載配置信息的代碼具體如下所示:

BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("D://applicationContext.xml"));

2.2 ApplicationContext

ApplicationContext 接口的全路徑爲 org.springframework.context.ApplicationContext,它不僅提供了 BeanFactory 的所有功能,還添加了對 i18n(國際化)、資源訪問、事件傳播等方面的良好支持。

ApplicationContext 是 BeanFactory 的子接口,也被稱爲應用上下文。

ApplicationContext 接口有兩個常用的實現類,具體如下所示:

  • ClassPathXmlApplicationContext
    該類從類路徑 ClassPath 中尋找指定的 XML 配置文件,找到並裝載完成 ApplicationContext 的實例化工作,具體如下所示:

    # configLocation 參數:用於指定 Spring 配置文件的名稱和位置,如 applicationContext.xml。
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);  
    
  • FileSystemXmlApplicationContext
    該類從指定的文件系統路徑中尋找指定的 XML 配置文件,找到並裝載完成 ApplicationContext 的實例化工作,具體如下所示:

    ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);
    

    它與ClassPathXmlApplicationContext 的區別:
    在讀取 Spring 的配置文件時,FileSystemXmlApplicationContext 不再從類路徑中讀取配置文件,而是通過參數指定配置文件的位置,它可以獲取類路徑之外的資源,如"D:/workspaces/applicationContext.xml"

使用 Spring 框架,當要創建 ApplicationContext 容器時,可以實例化任何一個類(ClassPathXmlApplicationContext 或 FileSystemXmlApplicationContext)。建議如下所示:

  • Java 項目中:通常會採用通過 ClassPathXmlApplicationContext 類實例化 ApplicationContext 容器的方式。
  • Web 項目中:是 Web 服務器完成實例化 ApplicationContext 容器的工作。Web 服務器實例化 ApplicationContext 容器通常使用基於 ContextLoaderListener 實現的方式,它只需要在 web.xml 中添加如下代碼:
    <!--指定Spring配置文件的位置,有多個配置文件時,以逗號分隔-->
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <!--spring將加載spring目錄下的applicationContext.xml文件-->
    <param-value>
        classpath:spring/applicationContext.xml
    </param-value>
    </context-param>
    <!--指定以ContextLoaderListener方式啓動Spring容器-->
    <listener>
     <listener-class>
       	 org.springframework.web.context.ContextLoaderListener
     </listener-class>
    </listener>
    

3 BeanFactory 和 ApplicationContext 的異同

  • 異:如果 Bean 的某一個屬性沒有注入,則使用 BeanFacotry 加載後,在第一次調用 getBean() 方法時會拋出異常,而 ApplicationContext 則在初始化時自檢,這樣有利於檢查所依賴的屬性是否注入。
  • 同:BeanFactory 和 ApplicationContext 都是通過 XML 配置文件加載 Bean 的。

介紹到這裏,相信大家心裏都有一個“理想對象”了吧?
那就是 ApplicationContext,在日常開發中通常選擇使用的都是這個接口,只有在系統資源較少時,才考慮一下 BeanFactory 哦。

4 文章其他地址

4.1 微信公衆號:碼農阿杰

4.2 博客園

5 參考資料

5.1 spring

5.2 Artifact Repository Browser

5.3 Apache Commons

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章