資深架構師帶你詳細瞭解,Spring之IoC容器

資深架構師帶你詳細瞭解,Spring之IoC容器

 

 

1、 IoC概述

IoC(Inverse of Control,控制反轉)是Spring容器的內核,AOP、聲明式事務等功能在此基礎上開花結構。不過IoC確實包括不少內涵,涉及代碼解耦、設計模式、代碼優化等問題的考量。java

先來說下以下場景:面試

《墨攻》中有個場景,劉德華飾演的墨者革離來到梁國城下,梁國守衛問道:「來者何人?」劉德華回答:「墨者革離」。設計模式

有以下幾種代碼實現方式:緩存

 

資深架構師帶你詳細瞭解,Spring之IoC容器

 

 

資深架構師帶你詳細瞭解,Spring之IoC容器

 

 

 

其實能夠這麼理解:飾演革離人物角色的,有多種選擇,不必定是劉德華,這個控制權掌握在導演手裏,因此最終的圖示關係就是以下圖:安全

 

資深架構師帶你詳細瞭解,Spring之IoC容器

 

 

那究竟是什麼東西的「控制」被「反轉」了呢?對應到前面的例子,「控制」是指選擇GeLi角色扮演者的控制權;「反轉」是指這種控制權從《墨攻》劇本中移除,轉交到導演受衆。對於軟件來講,即某一接口具體實現類的選擇控制權從調用類中移除,轉交到第三方決定,即由Spring容器藉由Bean配置來進行控制。session

控制反轉仍是比較晦澀難懂,那麼軟件界的泰斗級人物Martin Fowler提出了DI(Dependency Injection,依賴注入)的概念來代替IoC。架構

1.1 IoC的類型併發

1. 構造函數注入框架

2. 屬性注入異步

3. 接口注入

1.2 經過容器完成依賴關係的注入

所謂媒體「海選」和第三方代理機構,在程序領域就是一個第三方的容器,他幫助完成類的初始化與裝配工做,讓開發者從這些底層實現類的實例化、依賴關係裝配等工做中解脫出來,專一於更有意義的業務邏輯開發工做。這無疑是一件使人嚮往的事情。Spring就是這樣的一個容器,它經過配置文件或註解描述類和類之間的依賴關係,自動完成類的初始化和依賴注入工做。

2、 相關Java基礎知識

Java語言容許經過程序化的方式間接對Class進行操做。Class文件由類裝載器裝載後,在JVM中獎造成一份描述Class結構的元信息對象,經過該元信息對象能夠獲知Class的結構信息,如構造函數、屬性和方法等。Java容許用戶藉由這個與Class相關的元信息對象間接調用Class對象的功能,這就爲使用程序化方式操做Class對象開闢了途徑。

2.1 類裝載器 ClassLoader

1. 類裝載器的工做機制

類裝載器把一個類裝入JVM中,須要通過一下步驟:

(1)裝載:查找和導入Class文件

(2)連接:執行校驗、準備和解析步驟,其中解析步驟是能夠選擇的。

1. 校驗:檢查載入Class文件數據的正確性。

2. 準備:給類的靜態變量分配存儲空間。

3. 解析:將符號引用轉換成直接引用。

(3)初始化:對類的靜態變量、靜態代碼塊執行初始化工做。

 

資深架構師帶你詳細瞭解,Spring之IoC容器

 

 

2.2 Java反射機制

Java的反射體系保證了能夠經過程序化的方式訪問目標類中的全部的元素,對於private或protexted成員變量和方法,只要JVM的安全機制容許,也能夠經過反射進行調用。

架構師圈子:142019080

3、 資源抽象接口

JDK所提供的訪問資源的類(如 java.net.URL、FIle等)並不能很好的知足各類底層資源的訪問需求,好比缺乏從類路徑或者Web容器上下文獲取資源的操做類,鑑於此,Spring設計了一個Resource接口,它爲應用提供了更強的底層資源訪問能力。

 

資深架構師帶你詳細瞭解,Spring之IoC容器

 

 

資深架構師帶你詳細瞭解,Spring之IoC容器

 

 

 

4、 BeanFactory 和 ApplicationContext

Spring 經過一個配置文件描述Bean及Bean之間的依賴關係,利用Java語言的反射功能實例化Bean並創建Bean之間的依賴關係。Spirng的IoC容器在完成這些底層工做的基礎上,還提供了Bean實例緩存、生命週期管理、Bean實例代理、事件發佈、資源裝載等高級服務。

咱們通常稱BeanFactory爲IoC容器,而稱ApplicationContext爲應用上下文。但有時爲了行文方便,咱們也將ApplicationContext稱爲Spring容器。

BeanFactory是Spring框架的基礎設施,面向Spring自己;ApplicaitonContext面向使用Spring框架的開發者,幾乎全部的應用場合均可以使用ApplicationContext而非底層的BeanFactory。

4.1. 初始化BeanFactory

1) 對於單實例的Bean來講,BeanFactory會緩存Bean實例,因此第二次使用getBean()獲取Bean時,將直接從IoC容器的緩存中獲取Bean實例。

2) 在Spring中,DefaultSingletonBeanRegistry類中提供了一個用於緩存單實例Bean的緩存器,它是一個用HashMap實現的緩存器,單實例的Bean以beanName爲鍵保存在這個HashMap中。

3) 在初始化BeanFactory時,必須提供一種日誌框架

4.2 ApplicationContext介紹

若是說BeanFactory是Spring的「心臟」,那麼ApplicationContext就是完整的「身軀」了。

1. ApplicationContext類體系結構,它是一個接口,代碼以下:

public interface ApplicationContext extends ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
String getId();
String getDisplayName();
long getStartupDate();
ApplicationContext getParent();
AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}

 

1)ApplicationEventPublisher: 讓容器擁有發佈應用上下文事件的功能,包括容器啓動事件、關閉事件。

2)MessageSource: 爲應用提供i18n國際化消息訪問的功能

3)ResourcePatternResolver: 全部ApplicationContext實現類都實現了相似於PathMatchingResourcePatternResolver的功能,能夠經過帶前綴的Ant風格的資源文件路徑裝載Spring的配置文件。

4)LifeCycle: 該接口提供了start()和stop()兩個方法,主要用於控制異步處理過程。架構師圈子:142019080

初始化ApplicationContext的幾種方式:

1)若是配置文件放置在類路徑下,則能夠優先考慮使用ClassPathXmlApplicationContext實現類

 

資深架構師帶你詳細瞭解,Spring之IoC容器

 

 

 

2)若是配置文件放置在文件系統的路徑下,則能夠優先考慮使用FileSystemXml

 

資深架構師帶你詳細瞭解,Spring之IoC容器

 

 

 

3)基於註解的配置方式以下:

 

資深架構師帶你詳細瞭解,Spring之IoC容器

 

 

資深架構師帶你詳細瞭解,Spring之IoC容器

 

 

 

4)基於Groovy DSL來配置Bean

2. WebApplicationContext類體系結構

在非Web應用的環境下,Bean只有singletom和prototype兩種做用域。WebApplicationContext爲Bean添加了三個新的做用域:request、session和global session.

ConfigurableWebApplicationContext擴展了WebApplicationContext,它容許經過配置的方式實例化WebApplicationContext,同時定義了兩個重要的方法。

setServletContext(ServletContext context):爲Spring設置Web應用上下文,以便兩者整合。

setConfigLocations(String[] configLocation): 設置Spring配置文件地址。

3. WebApplicationContext初始化

1)使用配置文件

2)使用註解的方式

3)使用Groovy DSL的方式

4.3 父子容器

經過HierarchicalBeanFactory接口,Spring的IoC容器能夠創建父子層級關聯的容器體系,子容器能夠訪問如容器中的Bean,可是父容器不能訪問自容器中的Bean。

例如:Spring使用父子容器實現不少功能,好比在Spring MVC中,展示層Bean位於一個子容器中,而業務層和持久層Bean位於如容器中。這樣,展示層Bean就能夠引用業務層和持久層Bean,而業務層和持久層Bean則看不到展示層Bean。

5、BeanFactory中的Bean的生命週期

Spring爲Bean提供了細緻周全的生命週期過程,經過實現特定的接口或經過<bean>屬性設置,均可以對Bean的生命週期過程施加影響。Bean的生命週期不但和其實現的接口相關,還與Bean的做用範圍有關。爲了讓Bean綁定在Spring框架上,咱們推薦使用配置方式而非接口方式進行Bean生命週期的控制。

若是對java微服務、分佈式、高併發、高可用、大型互聯網架構技術、面試經驗交流。
能夠加我架構師圈子:142019080 領取資料,裏面天天更新資料,免費領取。

相關文章
相關標籤/搜索