Spring核心技術原理-(4)-三條路線告訴你如何掌握Spring IoC容器的核心原理

前幾篇:後端

Spring核心技術原理-(1)-經過Web開發演進過程瞭解一下爲何要有Spring?緩存

Spring核心技術原理-(2)-經過Web開發演進過程瞭解一下爲何要有Spring AOP?微信

Spring核心技術原理-(3)-Spring歷史版本變遷和現在的生態帝國網絡

1、前言

前三篇已經從歷史的角度和你們一塊兒探討了爲何會有Spring,Spring的兩個核心概念:IoC和AOP的雛形,Spring的歷史變遷和現在的生態帝國。本節的主要目的就是經過一個切入點帶你們一塊兒學習一下Spring IoC的核心原理,正如從歷史的角度出發講述爲何會有Spring同樣,但願經過這個切入點能讓你輕鬆的掌握住Spring IoC的核心原理。數據結構

本篇文章假設你已經能夠熟練的使用Spring了,所以對於某一個細節如何實現的不會在進行詳細的闡述!多線程

2、IoC和DI的基本概念

IoC(控制反轉,英文含義:Inverse of Control)是Spring容器的內核,AOP、事務等功能都是創建在此基礎上的。從字面意思上能夠把IoC拆分爲兩層含義:控制和反轉。控制能夠理解爲是接口實現類的選擇權,反轉能夠理解爲這個選擇權交給第三方進行管理;總的來講就是某一接口具體實現類的選擇控制權從調用類中移除,轉交給第三方進行決定,即由Spring容器經過Bean配置來進行控制,這樣的話應用程序自己就不用負責依賴對象的建立和維護,而由Spring容器進行管理。架構

儘管咱們如今對IoC的基本概念都已經熟讀與心了,可是在老一輩的時候,IoC的概念還不是很容易被人理解。在那個年代,業界的一位大佬,軟件界泰斗級的人物Martin Fowler提出了DI(Dependency Injection,依賴注入)的概念,來代替IoC。框架

依賴注入的概念和控制反轉的概念從本質上是同樣的,只是從不一樣的側面描述了這個功能。依賴注入的概念描述的是讓調用類對某一接口實現類的依賴關係有第三方容器或其餘東西注入,以此來移除對某一接口實現類的依賴。分佈式

這裏寫圖片描述

時至今日,咱們常說的IoC/DI的時候也是把依賴注入和控制反轉做爲同一個概念來進行闡述的!微服務

3、從哪裏入手IoC容器?

我曾嘗試過不少次,想踏進Spring原理的大門,可是一次次都被毫無頭緒的開端而打退!後來逐漸翻閱一些書籍逐漸造成了那麼一點點思路,接下來主要按着個人思路探討一下Ioc容器的基本原理。

正如咱們學習騎自行車同樣,開始的時候都是先看別人如何騎的,而後本身才能慢慢的學會(固然發明自行車的人是天才)。學習Spring原理也是同樣,只有掌握了基本的Spring的使用,纔有可能踏進Spring原理的大門。所以,這裏咱們從如何使用開始哪?

一、首先看一下項目結構

這裏寫圖片描述

繼承關係:

這裏寫圖片描述

bean的配置:

這裏寫圖片描述

Main代碼以下:

這裏寫圖片描述

二、相信每個學習Spring的小夥伴都是從上述的方式學起的,上圖中最顯眼的兩個類就是紅色圈圈出的,也設置咱們在最開始使用到的,使用UML工具顯示最基本的類圖關係:

這裏寫圖片描述

龐大的一個繼承和實現體系!看到這裏大體上也就是我要說的第二條路線了(下文會詳細介紹)!這條路線向咱們展現了從Spring最接近用開發人員使用的ClassPathXmlApplicationContextFileSystemXmlApplicationContext類到Spring的頂層接口之間層層的繼承和實現關係。

看到這裏咱們彷佛仍是毫無頭緒,這就須要咱們借鑑前人的經驗了,這個經驗就是如何正確的理解BeanFactoryApplicationContext之間的關係。

4、BeanFactory和ApplicationContext之間的關係

咱們都知道Spring是經過配置文件、註解、Java類等方式描述Bean與Bean之間的依賴關係,利用Java的反射功能實例化Bean並創建Bean與Bean之間的依賴關係;

這些底層的工做正是由Spring IoC容器完成的,除此以外Spring IoC容器還提供了Bean實例緩存、生命週期管理、時間發佈等高級服務。

而這裏要說的BeanFactoryApplicationContext都做爲Spring IoC容器的形態存在,只不過有些許區別而已,簡單的來講:(1)BeanFactory接口的實現類是一個簡單容器系列,該系列的容器只實現了容器最基本的功能;(2)ApplicationContext接口的實現類是一個高級容器系列,該系列的容器在簡單容器的基礎上增長了不少面向框架的特性,對應用環境作了不少適配,同時添加了不少面向應用的功能,例如:國際化支持和框架事件體系結構等。

一般狀況下,咱們習慣稱BeanFactory爲Ioc容器,而稱ApplicationContext爲應用上下文,有時候咱們還直接稱ApplicationContext爲Spring容器。

至此,我應該能夠引出我要說的前兩條路線:第一條路線是基於BeanFactory的簡單容器系列;次日路線是基於ApplicationContext的高級容器系列;

5、第一條路線:基於BeanFactory的簡單容器系列

既然BeanFactory的實現類也是一個容器,那麼咱們就應該可使用它來注入咱們的Bean和獲取咱們的Bean,如何使用哪?請看代碼:

這裏寫圖片描述

(1)建立IoC配置文件的抽象資源,這個抽象資源包含了BeanDefinition的定義信息(也就是咱們在bean.xml文件中配置的一個bean的數據結構); (2)建立一個BeanFactory,這裏使用的是DefaultListableBeanFactory; (3)建立一個載入BeanDefinition的讀取器,這裏使用的是XmlBeanDefinitionReader來載入XML形式的BeanDefinition,經過一個回調配置給BeanFactory; (4)從定義好的資源位置讀入配置信息,具體的解析過程由XmlBeanDefinitionReader來完成。

上述的過程,完成了整個載入和註冊Bean的定義以後,咱們所須要的IoC容器就創建起來了,這個時候咱們就能夠直接使用IoC容器了。

上述代碼中使用了DefaultListableBeanFactory 這個BeanFactory默認實現的容器完成了Bean的注入和獲取操做,查看其繼承和實現關係以下:

這裏寫圖片描述

BeanFactory位於接口類結構的頂端,它主要定義了IoC容器中應該具備的基本特性,主要接口定義以下,根據名稱就能夠看出是什麼做用,這裏再也不一一解釋:

這裏寫圖片描述

面對如此多的接口或類,咱們應該如何理解哪?舉個栗子,就像一輛汽車同樣,BeanFactory中定義了這輛汽車應該具備的基本功能,經過層層的接口繼承和實現爲這個基本的汽車架構定製了不少特性,好比:能夠座幾我的,是否能夠倒車等,一直到最後才造成了一輛基本能夠正常使用的汽車,但到這一步仍是一個比較粗糙的產品或者半成品。(可使用,但對於普通用戶不會直接使用)

而關於這些接口或類的介紹,因爲篇幅有限,這裏再也不一一介紹,主要給你們提供一種思路,如何順藤摸瓜,掌握第一條理解Spring IoC容器的路線。

總的來講,BeanFactory是Spring框架的基礎設置,面向的是Spring自己,下文中講述的第二條路線其中也是使用到了上述代碼中的過程,咱們在實際的開發中不多會直接使用基於BeanFactory的簡單容器系列。

6、第二條路線:基於ApplicationContext的高級容器系列

相對於第一條路線中的汽車半成品來講,第二個路線下的產品才真正算是一輛能夠開的出去的汽車,在基於ApplicationContext的高級容器系列下爲汽車新增了不少特性,好比:加了電子檔位、加了倒車雷達、全景天窗、全液晶顯示器什麼的,一直到最後才造成了一輛可使用的汽車(可使用,普通用戶也能夠直接使用)。

這裏寫圖片描述

從上圖中能夠看出來,相對於BeanFactory來講ApplicationContext增長了不少新特性,例如MessageSource接口、ApplicationEventPublisher接口等,因此說ApplicationContext是一個高級形態意義上的IoC容器。

ApplicationContext的主要實現類是ClassPathXmlApplicationContextFileSystemXmlApplicationContext,前者是經過從類路徑加載配置文件,後者模式從文件系統中裝載配置。

7、第三條路線:基於WebApplicationContext的Web容器系列

從上邊的介紹咱們應該已經看出來了,不論是第一條路線仍是第二條路線都是基於Java應用的,而咱們使用最多的是JavaWeb應用,這也是接下來要說的第三條路線:基於WebApplicationContext的Web容器系列。

這裏寫圖片描述

WebApplicationContext是專門爲Web應用準備的,因爲Web應用比通常的Java應用擁有更多的特性,所以WebApplicationContext擴展了ApplicationContext。

這裏寫圖片描述

咱們在配置Spring集成Spring MVC的時候基本都會使用上述的方式配置Spring容器,ContextLoaderListener經過Web容器上下文參數contextConfigLocation獲取Spring配置文件的位置。若是隻是使用Xml配置的Bean的話,會使用WebApplicationContext的實現類XmlWebApplicationContext。

8、總結

本文的目的並非詳細的闡述Spring IoC容器的核心原理,這是由於市面上已經有不少書講述Spring IoC容器的核心原理的,而且簡單的一篇文章很難說清楚這麼多的內容,這裏主要是是但願經過將Spring IoC容器的核心原理內容進行劃分,整理爲3條基本路線,這樣的話逐步擊破,才能使本身不會被龐大的代碼結構體系所嚇到!

紙上得來終覺淺,絕知此事要躬行!

對於Spring IoC容器的核心原理遠不止這些,可是基本都是在這三條主線上進行穿插,其餘沒有提到的如:容器初始化,配置文件解析過程、Bean的解析和註冊等,但願你們在在進行學習的時候注意到!

若是想進一步學習Spring原理的,這裏推薦兩本書籍《Spring技術內幕-深刻解析Spring架構與設計原理》和《精通Spring 4.x 企業應用開發實戰》,前者可能有點久,版本不是最新的,可是書中Spring IoC容器和AOP的講解仍是頗有參考價值的,後者應該算是市面上一本講解還算透徹的書籍,值得閱讀!

在這裏插入圖片描述

【視頻福利】2T免費學習視頻,搜索或掃描上述二維碼關注微信公衆號:Java後端技術(ID: JavaITWork)回覆:1024,便可免費獲取!內含SSM、Spring全家桶、微服務、MySQL、MyCat、集羣、分佈式、中間件、Linux、網絡、多線程,Jenkins、Nexus、Docker、ELK等等免費學習視頻,持續更新!

相關文章
相關標籤/搜索