本文為作者搜集的Spring關於IoC/DI相關知識的記錄整理筆記。介紹了IoC(控制反轉)是一種設計原則,用於降低代碼的耦合度。介紹了IoC是通過BeanDefinition來定義Bean對象及其關係,用BeanFactory來管理Bean的生命周期。 ...
一、摘要
本文為作者搜集的Spring關於IoC/DI相關知識的記錄整理筆記。介紹了IoC(控制反轉)是一種設計原則,用於降低代碼的耦合度。介紹了IoC是通過BeanDefinition來定義Bean對象及其關係,用BeanFactory來管理Bean的生命周期。
二、什麼是IoC/DI
IoC,全稱Inversion of Control,控制反轉,是面向對象編程中的一種設計原則,這種設計可以減低電腦代碼之間的耦合度。 通過IoC,對象在創建的時候,就不需要調用方用new的方式來創建實例,而是由外部系統創建對象實例,並把對象引用傳遞給調用方。 IoC的實現方式有DI(Dependency Injection,依賴註入)和DL(Dependency Lookup,依賴查找),其中在Spring中DI就是由Spring框架負責創建實例,並把註入到調用方對象中,如圖1。![](http://www.guanjianzhuo.com/wp-content/uploads/2018/08/IoC%E7%A4%BA%E6%84%8F%E5%9B%BE.png)
三、Spring IoC體繫結構
IoC容器用來完成對象的創建和依賴管理,對象和對象關係可以使用XML文件、註解來描述。 Spring框架中,對象的創建可以看BeanFactory,對象及其關係的定義可以看BeanDefinition。1、BeanFactory
![](http://www.guanjianzhuo.com/wp-content/uploads/2018/08/BeanFactory%E7%B1%BB%E7%BB%A7%E6%89%BF%E5%9B%BE.png)
2、BeanDefinition
BeanDefinition是用來定義Bean的一個介面,是Bean對象的抽象數據結構,其包括了構造器參數、屬性參數以及其它具體的參數。四、IoC容器的初始化及Bean的作用域及其生命周期
1、IoC容器的初始化
三個基本過程:資源定位、載入、註冊; (1)Resource定位:Bean的定義文件定位 (2)載入:將Resource定位好的資源載入到BeanDefinition (3)註冊:將BeanDefinition註冊到容器中 Spring會將資源定位成為Resource對象,BeanDefinition會讀取Resource形成BeanDefinition對象。最終BeanDefinition會和beanName、Alias一同封裝到BeanDefinitionHolder類中,註冊到BeanFactory的實現類(DefaultListtableBeanFactory.beanDefinitionMap)中。 Spring容器會根據註冊的BeanDefinition信息將Bean進行實例化。2、Bean的生命周期
這裡講Bean的生命周期,瞭解Bean的生命周期,可以根據自己的需要,在不同階段做一些定製處理。 Bean的生命周期線索:實例化、初始化、使用、銷毀 示意圖:![](http://www.guanjianzhuo.com/wp-content/uploads/2018/08/Bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.png)
3、Bean的作用域
Bean由IoC容器進行管理的對象,每個作用域的總結如下:類別 | 說明 | 應用 |
singleton | 預設為單例模式,在Spring IoC容器中僅存在一個Bean實例。 | 無狀態Bean |
prototype | 每次從容器中調用Bean,都返回一個新的實例。 | 有狀態Bean |
request | 每次Http請求都會創建一個新的Bean(僅限WebApplicationContext環境) | 創建的Bean僅當前Http請求有效。 |
session | Http Session共用一個Bean(僅限WebApplicationContext環境) | 創建的Bean僅當前Http Session有效。 |
globalSession | 一般用於Portlet應用環境(僅限WebApplicationContext環境) | 不知道有什麼鬼用 |