一、 Spring系統架構
1.1 系統架構圖
-
Spring Framework是Spring生態圈中最基礎的專案,是其他專案的根基。
-
Spring Framework的發展也經歷了很多版本的變更,每個版本都有相應的調整
-
Spring Framework的5版本目前沒有最新的架構圖,而最新的是4版本,所以接下來主要研究的是4的架構圖
(1)核心層
-
Core Container:核心容器,這個模組是Spring最核心的模組,其他的都需要依賴該模組
(2)AOP層
-
AOP:面向切面程式設計,它依賴核心層容器,目的是
在不改變原有程式碼的前提下對其進行功能增強
-
Aspects:AOP是思想,Aspects是對AOP思想的具體實現
(3)資料層
-
Data Access:資料訪問,Spring全家桶中有對資料訪問的具體實現技術
-
Data Integration:資料整合,Spring支援整合其他的資料層解決方案,比如Mybatis
-
Transactions:事務,Spring中事務管理是Spring AOP的一個具體實現
(4)Web層
-
具體體現在SpringMVC框架
(5)Test層
-
Spring主要整合了Junit來完成單元測試和整合測試
-
二、Spring核心概念
在Spring核心概念這部分內容中主要包含IOC/DI
、IOC容器
和Bean
,那麼問題就來了,這些都是什麼呢?
2.1 目前專案中的問題
要想解答這個問題,就需要先分析下目前我們們程式碼在編寫過程中遇到的問題:
(1)業務層需要呼叫資料層的方法,就需要在業務層new資料層的物件
(2)如果資料層的實現類發生變化,那麼業務層的程式碼也需要跟著改變,發生變更後,都需要進行編譯打包和重部署
(3)所以,現在程式碼在編寫的過程中存在的問題是:耦合度偏高
針對這個問題,該如何解決呢?
我們就想,如果能把框中的內容給去掉,不就可以降低依賴了麼,但是又會引入新的問題,去掉以後程式能執行麼?
答案肯定是不行,因為bookDao沒有賦值為Null,強行執行就會出空指標(NPE)異常。
所以現在的問題就是,業務層不想new物件,執行的時候又需要這個物件,該咋辦呢?
針對這個問題,Spring就提出了一個解決方案:
-
使用物件時,在程式中不要主動使用new產生物件,轉換為由
外部
提供物件。這種實現思就是Spring的一個核心概念(IOC)
2.2 IOC、IOC容器、Bean、DI
-
IOC(Inversion of Control)控制反轉
(1)什麼是控制反轉呢?
-
使用物件時,由主動new產生物件轉換為由
外部
提供物件,此過程中物件建立控制權由程式轉移到外部,此思想稱為控制反轉。-
業務層要用資料層的類物件,以前是自己
new
的 -
現在自己不new了,交給
別人[外部]
來建立物件 -
別人[外部]
就反轉控制了資料層物件的建立權 -
這種思想就是控制反轉
-
別人[外部]指定是什麼呢?
-
(2)Spring和IOC之間的關係是什麼呢?
-
Spring技術對IOC思想進行了實現
-
Spring提供了一個容器,稱為
IOC容器
,用來充當IOC思想中的"外部" -
IOC思想中的
別人[外部]
指的就是Spring的IOC容器
(3)IOC容器的作用以及內部存放的是什麼?
-
IOC容器負責物件的建立、初始化等一系列工作,其中包含了資料層和業務層的類物件
-
被建立或被管理的物件在IOC容器中統稱為
Bean
-
IOC容器中放的就是一個個的Bean物件
(4)當IOC容器中建立好service和dao物件後,程式能正確執行麼?
-
不行,因為service執行需要依賴dao物件
-
IOC容器中雖然有service和dao物件
-
但是service物件和dao物件沒有任何關係
-
需要把dao物件交給service,也就是說要繫結service和dao物件之間的關係
像這種在容器中建立物件與物件之間的繫結關係就要用到DI:
-
DI(Dependency Injection)依賴注入
(1)什麼是依賴注入呢?
-
在容器中建立bean與bean之間的依賴關係的整個過程,稱為依賴注入
-
業務層要用資料層的類物件,以前是自己
new
的 -
現在自己不new了,靠
別人[外部其實指的就是IOC容器]
來給注入進來 -
這種思想就是依賴注入
-
(2)IOC容器中哪些bean之間要建立依賴關係呢?
-
這個需要程式設計師根據業務需求提前建立好關係,如業務層需要依賴資料層,service就要和dao建立依賴關係
介紹完Spring的IOC和DI的概念後,我們會發現這兩個概念的最終目標就是:充分解耦
,具體實現靠:
-
使用IOC容器管理bean(IOC)
-
在IOC容器內將有依賴關係的bean進行關係繫結(DI)
-
最終結果為:使用物件時不僅可以直接從IOC容器中獲取,並且獲取到的bean已經繫結了所有的依賴關係.
2.3 核心概念小結
(1)什麼IOC/DI思想?
-
IOC:控制反轉,控制反轉的是物件的建立權
-
DI:依賴注入,繫結物件與物件之間的依賴關係
(2)什麼是IOC容器?:Spring建立了一個容器用來存放所建立的物件,這個容器就叫IOC容器
(3)什麼是Bean?:容器中所存放的一個個物件就叫Bean或Bean物件