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

您的「關注」和「點贊」,是信任,是承認,是支持,是動力......java

如意見相佐,可留言。
本人必將不遺餘力試圖作到準確和全面,終其一輩子進行修改補充更新。程序員

1 Spring IoC 概述

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

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

簡單理解,IoC(控制反轉)就是控制權的轉移,即把建立(new)對象的權利,反轉給第三方Spring 框架去建立(new)。也就是把對象的建立的權利及對象的生命週期的管理過程交由Spring 框架來處理,今後在開發過程當中再也不須要關注對象的建立和生命週期的管理,而是在須要時由 Spring 框架提供,這個由 Spring 框架管理對象建立和生命週期的機制稱之爲控制反轉。而在建立對象的過程當中 Spring 能夠依據配置對對象的屬性進行設置,這個過稱之爲依賴注入,也即 DI。apache

示意以下所示:服務器

# 之前

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,並調用它們的生命週期方法。app

BeanFactory 接口有多個實現類,最多見的以下所示:框架

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

建立 BeanFactory 實例時,須要提供 Spring 所管理容器的詳細配置信息,這些信息一般採用 XML 文件形式管理。webapp

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

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 CSDN 博客

5 參考資料

5.1 spring

5.2 Artifact Repository Browser

5.3 Apache Commons

相關文章
相關標籤/搜索