概述
Spring IOC控制反轉,分為兩個方面解釋:
- 控制:物件對於內部成員的控制
- 反轉:將之前物件管理自己內部成員,轉變為ioc容器管理,目的是接耦
IOC的好處是:
- 無需手動建立,拿來就用
- 享受單例的好處,效率高、節省空間
- 統一配置,方便管理
原理
spring ioc容器原理是根據Java的反射機制,獲取類的所有資訊,再通過xml或者註解配置獲取類與類之間的關係,最後根據以上資訊構建類與類之間的依賴。
容器載入bean原理如下:
- 根據xml、註解獲取bean的配置資訊,在容器內部建立登錄檔
- 根據登錄檔例項化bean,並建立bean與bean之間的依賴
- 將初始化的bean儲存在容器的快取中(hashmap),等待客戶端呼叫(bean的作用域為singleton,如果為property則不快取直接返回)
Spring容器
bean工廠分為兩種:
- BeanFactory,面向Spring
- ApplicationContext,基於BeanFactory基礎,實現了一系列功能
兩者區別?
- BeanFactory初始化bean採用懶載入,在獲取的時候才建立;ApplicationContext啟動時一次性全部載入,如果配置錯誤則無法啟動容器,可以提前檢測配置正確性,當然也導致容器啟動速度慢
- 對於配置檔案,ApplicationContext提供了訪問URL和檔案訪問的介面
- ApplicationContext支援aop
- BeanFactory介面需手動註冊,ApplicationContext自動
容器啟動原理
web環境Spring、Spring mvc容器載入過程
對於一個web應用,部署在web容器中,容易提供一個全域性應用上下文(ServletContext),為後面的IOC容器提供宿主環境。
其次,因為web.xml中會提供有contextLoaderListener(或ContextLoaderServlet),當web容器啟動後,觸發IOC容器初始化時間,contextLoaderListener監聽到事件後,Spring將初始化一個上下文(WebApplicationContext介面),實現類為XmlWebApplicationContext(IOC容器)。 IOC初始化後,開始初始化各種servlet(DispatchServlet),以IOC容器為宿主環境進行初始化(兩者都有屬於自己的bean快取)
bean生命週期
Spring IOC模式與工廠模式的區別?
當需求改變,工廠模式需要手動修改;IOC是動態生成的