華文網

(超級乾貨)10分鐘真正理解和掌握Spring框架核心思想

真正理解和掌握Spring框架核心思想

1. 理解和掌握Spring框架的意義

從發展的層面:最流行的企業級框架

從技術的層面:降低開發難度,提高開發效率

從專案的層面:促進專案的快速開發、快速部署、快速見效

2. 屬性注入

2.1 什麼是屬性注入

其實很簡單,就是將指定的值設置給我們的目標類的目標屬性,比如有一個User類,我們要針對它的一個實例user,將它的nickName 屬性的值設置為“海綿寶寶”,這就是屬性注入。

2.2 怎麼做

2.2.1 最簡單的,通過set方法(許多地方將這類方法統統叫setter)

先定義一個類

現在這麼調用:

簡單吧!再看下一種,也很簡單:

2.2.2 通過構造器

然後我們這麼調用:

2.2.3 通過配置進行注入

這種方式是最複雜的,它的核心思想是:定義一個通用的能夠創建各種類的工廠(我們稱之為Bean工廠),然後通過設定檔的方式 來管理這些類的創建和調用依賴以及銷毀。那麼問題來了,既然有上面兩種如此簡單的方式,我們為什麼還要弄這麼一種複雜的方 式???

答案卻很簡單:因為上面兩種方式,對於企業級大規模的應用,存在難以克服的障礙和困難。比如說一個大型系統,我們創建了使用者 類或者訂單類或者商品類等等之類的很多很多類的這樣的情況,然後又有N個場景都在使用這些類,都在調用這些類,這個時候,如 果需求變了,欄位有增減,或者業務業務規則有變化,我們怎麼辦?我們得找到所有凡是調用了這些類的地方,

然後統統改一遍,再 然後,就是反復核對有沒有地方漏了,而且如果要上線,凡是改動過的地方,都要重新測試,想想這個成本得有多大。

下面讓我們看看如何實現它?

我們繼續使用2.2.1節中定義的User類,嘗試使用通用的方法創建它,那麼我們要怎麼做呢?

第一步:創建一個設定檔:

起名叫applicationContext.xml,放在Maven工程的resources目錄下。這個設定檔很簡單,就是定義一個Bean,然後指定它是從 哪個類來創建,

然後它有兩個屬性,我們分別要給它們指定值。

第二步:寫一個Bean工廠的類:

這個類的主要思想是:通過指定類型的傳入,反射它的所有屬性,和設定檔XML中的定義進行對照,匹配的情況下,產生實體這個類 物件,然後得到並調用它的setter方法進行屬性值的設置(當然還有另外一種做法,就是直接調用相對應的屬性欄位,設置它的值 而不必通過setter方法,但是結果是一樣的),完成之後返回這個實例物件。

現在我們可以看到,只要我們定義了這個一個設定檔和Bean工廠,它們作為萬用群組件存在,然後我們在外面要使用任何類,只需要 完成這個類的定義和相應的設定檔的定義就好了,只要它們的對應關係正確了,就能通過這個工廠和設定檔把它創建出來。

來,我們寫個測試類,測一下它:

運行結果:

現在我們不改Bean工廠,我們去寫一個新的Order訂單類,然後再更新一下設定檔,看能不能自動創建出來:

設定檔:

更新測試用例:

看結果:

這就是依賴注入的核心思想!!!

那麼Spring是怎麼使用它的呢?其實很簡單,Spring自己寫了一套XML這種方式的應用支援元件,然後在Web應用啟動的時候,就去 載入解析相應的檔,創建所有已經指定的Bean,然後把這個Bean放在自己的容器中,任何應用的任何元件都可以隨時從這裡得到 一個Bean的實例物件去使用它。而且Spring還做了很多的優化,比如能創建單例的,它就創建為單例,減少系統資源開銷。

這裡還有一個不大不小的問題:如果User類中依賴了其他類,它的屬性不是int、long、String這種系統內置類型,是我們 或者團隊其他成員創建的類,怎麼辦呢?這個時候我們就擴展這個Bean工廠的功能,讓它完成這樣的操作:A類在創建的時候, 發現它依賴了類B,那麼去創建類B,如果B類又依賴了類C,再去創建類C,依此類推,直到所有依賴項都創建完了,再返回來 完成A這個類的創建,這種情況下,XML設定檔中這些Bean的property子節點下用的是ref這個標籤,而不是type和value。雖 說形式不同,但是本質思想是一樣的。

而且,Spring除了這種XML的方式,還提供了一種Java注解的方式,也就是說不用寫XML這種設定檔,而是把想要創建的類上加上一 個Spring預定義的注解,再在啟動配置中指定我們要創建的類都在哪個包中,然後讓Spring自動去掃描和發現這些類並自動創建它們 的Bean,自動化程度還是蠻高的。

回顧總結這種方式,它們和傳統的做法最大的區別在於:傳統的模式是,誰要用User,誰去創建,誰去維護,Spring的模式是,有一個 叫做應用上下文的元件,它統一創建和維護各種Bean,然後放到容器中去,誰要用隨時來取,隨時來用,不需要關心什麼時間創建, 怎麼創建。控制權反轉了,這就是控制反轉(IoC,Inverse of Control)。而Spring對於類之間的依賴關係,會自動的逐級去“追” 並自動處理,所有的依賴項都是通過屬性注入的方式進行解決,使用將需要的值注入屬性(包括依賴項)的這種做法來完成類的完整的 創建,就是依賴注入(DI,Dependency Injection)。

文章原文在我的Github上:地址:

https://github.com/ccpwcn/spring-demo/blob/master/learning.md

這可是正宗的Markdown文本,閱讀起來比這裡更爽,也熱烈歡迎大家訪問我的Github啊!

就是直接調用相對應的屬性欄位,設置它的值 而不必通過setter方法,但是結果是一樣的),完成之後返回這個實例物件。

現在我們可以看到,只要我們定義了這個一個設定檔和Bean工廠,它們作為萬用群組件存在,然後我們在外面要使用任何類,只需要 完成這個類的定義和相應的設定檔的定義就好了,只要它們的對應關係正確了,就能通過這個工廠和設定檔把它創建出來。

來,我們寫個測試類,測一下它:

運行結果:

現在我們不改Bean工廠,我們去寫一個新的Order訂單類,然後再更新一下設定檔,看能不能自動創建出來:

設定檔:

更新測試用例:

看結果:

這就是依賴注入的核心思想!!!

那麼Spring是怎麼使用它的呢?其實很簡單,Spring自己寫了一套XML這種方式的應用支援元件,然後在Web應用啟動的時候,就去 載入解析相應的檔,創建所有已經指定的Bean,然後把這個Bean放在自己的容器中,任何應用的任何元件都可以隨時從這裡得到 一個Bean的實例物件去使用它。而且Spring還做了很多的優化,比如能創建單例的,它就創建為單例,減少系統資源開銷。

這裡還有一個不大不小的問題:如果User類中依賴了其他類,它的屬性不是int、long、String這種系統內置類型,是我們 或者團隊其他成員創建的類,怎麼辦呢?這個時候我們就擴展這個Bean工廠的功能,讓它完成這樣的操作:A類在創建的時候, 發現它依賴了類B,那麼去創建類B,如果B類又依賴了類C,再去創建類C,依此類推,直到所有依賴項都創建完了,再返回來 完成A這個類的創建,這種情況下,XML設定檔中這些Bean的property子節點下用的是ref這個標籤,而不是type和value。雖 說形式不同,但是本質思想是一樣的。

而且,Spring除了這種XML的方式,還提供了一種Java注解的方式,也就是說不用寫XML這種設定檔,而是把想要創建的類上加上一 個Spring預定義的注解,再在啟動配置中指定我們要創建的類都在哪個包中,然後讓Spring自動去掃描和發現這些類並自動創建它們 的Bean,自動化程度還是蠻高的。

回顧總結這種方式,它們和傳統的做法最大的區別在於:傳統的模式是,誰要用User,誰去創建,誰去維護,Spring的模式是,有一個 叫做應用上下文的元件,它統一創建和維護各種Bean,然後放到容器中去,誰要用隨時來取,隨時來用,不需要關心什麼時間創建, 怎麼創建。控制權反轉了,這就是控制反轉(IoC,Inverse of Control)。而Spring對於類之間的依賴關係,會自動的逐級去“追” 並自動處理,所有的依賴項都是通過屬性注入的方式進行解決,使用將需要的值注入屬性(包括依賴項)的這種做法來完成類的完整的 創建,就是依賴注入(DI,Dependency Injection)。

文章原文在我的Github上:地址:

https://github.com/ccpwcn/spring-demo/blob/master/learning.md

這可是正宗的Markdown文本,閱讀起來比這裡更爽,也熱烈歡迎大家訪問我的Github啊!