Spring IoC,全稱 Spring Inversion of Control ,控制反轉。 IoC(控制反轉) 是指在程式開發中,實例的創建不再由調用者管理,而是由 Spring 容器創建。Spring 容器會負責控製程序之間的關係,而不是由程式代碼直接控制,因此,控制權由程式代碼轉移到了 S... ...
您的“關註”和“點贊”,是信任,是認可,是支持,是動力......
如意見相佐,可留言。
本人必將竭盡全力試圖做到準確和全面,終其一生進行修改補充更新。
目錄
1 Spring IoC 概述
Spring IoC,全稱 Spring Inversion of Control ,控制反轉。
IoC(控制反轉) 是指在程式開發中,實例的創建不再由調用者管理,而是由 Spring 容器創建。Spring 容器會負責控製程序之間的關係,而不是由程式代碼直接控制,因此,控制權由程式代碼轉移到了 Spring 容器中,控制權發生了反轉,這就是 Spring 的 IoC 思想。
簡單理解,IoC(控制反轉)就是控制權的轉移,即把創建(new)對象的權利,反轉給第三方Spring 框架去創建(new)。也就是把對象的創建的權利及對象的生命周期的管理過程交由Spring 框架來處理,從此在開發過程中不再需要關註對象的創建和生命周期的管理,而是在需要時由 Spring 框架提供,這個由 Spring 框架管理對象創建和生命周期的機制稱之為控制反轉。而在創建對象的過程中 Spring 可以依據配置對對象的屬性進行設置,這個過稱之為依賴註入,也即 DI。
示意如下所示:
# 以前
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 哦。