Spring 框架學習—控制反轉(IOC)

spring是一個開源框架,Spring是於2003 年興起的一個輕量級的Java 開發框架,由Rod Johnson創建。

簡單來說,Spring是一個分層的JavaSE/EEfull-stack(一站式) 輕量級開源框架,主要用於降低模塊之間耦合度的框

架,實際上Spring除了能夠通過IoC降低模塊之間的耦合度外還提供了其它功能。


1、IoC的基礎知識以及原理:
     

        IoC理論的背景:在採用面向對象方法設計的軟件系統中,底層實現都是由N個對象組成的,所有的對象通過彼此的合作,最終

實現系統的業務邏輯。即軟件系統中對象之間的耦合,對象A和對象B之間有關聯,對象B又和對象C有依賴關係,這樣對象和對象之

間有着複雜的依賴關係,所以纔有了控制反轉這個理論。


2、什麼是控制反轉(IoC):


(1)IoC是Inversion of Control的縮寫,有的翻譯成“控制反轉”,還有翻譯成爲“控制反向”或者“控制倒置”。

(2)1996年,Michael Mattson在一篇有關探討面向對象框架的文章中,首先提出了IoC 這個概念。簡單來說就是把複雜系統分解

成相互合作的對象,這些對象類通過封裝以後,內部實現對外部是透明的,從而降低了解決問題的複雜度,而且可以靈活地被重用

和擴展。IoC理論提出的觀點大體是這樣的:藉助於“第三方”實現具有依賴關係的對象之間的解耦,如下圖所示:




         即把各個對象類封裝之後,通過IoC容器來關聯這些對象類。這樣對象與對象之間就通過IoC容器進行聯繫,但對象與對象之間

並沒有什麼直接聯繫。如果去掉IoC容器後系統中的對象A與對象B就有了直接關係,如下圖所示:



比如好多的對象類要關聯起來的話,就會變得很複雜,如下圖所示:



所以提出IoC控制反轉是很有必要的。


3、爲什麼要把這種方式叫做控制反轉呢?


(1) 軟件系統在沒有引入IoC容器之前,對象A依賴對象B,那麼A對象在實例化或者運行到某一點的時候,自己必須主動創建對象

B或者使用已經創建好的對象B,其中不管是創建還是使用已創建的對象B,控制權都在我們自己手上。

(2)如果軟件系統引入了Ioc容器之後,對象A和對象B之間失去了直接聯繫,所以,當對象A實例化和運行時,如果需要對象B的

話,IoC容器會主動創建一個對象B注入到對象A所需要的地方。

(3)通過前面的對比,可以看到對象A獲得依賴對象B的過程,由主動行爲變成了被動行爲,即把創建對象交給了IoC容器處理,控

制權顛倒過來了,這就是控制反轉的由來!

 

 




4、IoC的別名:依賴注入(DI)


(1)2004年,Martin Fowler探討了同一個問題,既然IoC是控制反轉,那麼到底是“哪些方面的控制被反轉了呢?”,經過詳細地分

析和論證後,他得出了答案:“獲得依賴對象的過程被反轉了”。控制被反轉之後,獲得依賴對象的過程由自身管理對象變爲由IoC容

器主動注入。於是,他給“控制反轉”取了一個更合適的名字叫做“依賴注入(Dependency Injection,DI)”。他的這個答案,實際上

給出了實現IoC的方法:注入。

(2)所謂依賴注入,就是由IoC容器在運行期間,動態地將某種依賴關係注入到對象之中。

(3)所以,依賴注入(DI)和控制反轉(IoC)是從不同的角度描述的同一件事情,就是指通過引入IoC容器,利用依賴關係注入的

方式,實現對象之間的解耦。



5、使用IoC的好處:


(1)可維護性比較好,非常便於進行單元測試,便於調試程序和診斷故障。代碼中的每一個Class都可以單獨測試,彼此之間互不

影響,只要保證自身的功能無誤即可,這就是組件之間低耦合或者無耦合帶來的好處。

(2)每個開發團隊的成員都只需要關注自己要實現的業務邏輯,完全不用去關心其他人的工作進展,因爲你的任務跟別人沒有任何

關係,你的任務可以單獨測試,你的任務也不用依賴於別人的組件,再也不用扯不清責任了。所以,在一個大中型項目中,團隊成

員分工明確、責任明晰,很容易將一個大的任務劃分爲細小的任務,開發效率和產品質量必將得到大幅度的提高。

(3)可複用性好,我們可以把具有普遍性的常用組件獨立出來,反覆應用到項目中的其它部分,或者是其它項目,當然這也是面向

對象的基本特徵。顯然,IoC更好地貫徹了這個原則,提高了模塊的可複用性。符合接口標準的實現,都可以插接到支持此標準的模

塊中。


(4)IoC生成對象的方式轉爲外置方式,也就是把對象生成放在配置文件裏進行定義,這樣,當我們更換一個實現子類將會變得很

簡單,只要修改配置文件就可以了,完全具有熱插撥的特性。




6、IoC的原理:

       

        控制反轉是spring框架的核心。其原理是基於面向對象(OO)設計原則的The Hollywood Principle:Don't call us, we'll call you

(別找我,我會來找你的)。也就是說,所有的組件都是被動的,所有的組件初始化和調用都由容器負責。組件處在一個容器當

中,由容器負責管理。簡單的來講,就是由容器控制程序之間的關係,而非傳統實現中,由程序代碼直接操控,即在一個類中調用

另外一個類。這也就是所謂“控制反轉”的概念所在:控制權由應用代碼中轉到了外部容器,控制權的轉移,即所謂反轉。



看到這裏,相信大家已經對IoC有了初步的瞭解,那我們接着看看Spring框架。

 

         輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小隻有1MB多的JAR文件裏發佈。並

且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的對象不依賴於Spring的特定類。

        控制反轉——Spring通過一種稱作控制反轉(IoC)的技術促進了低耦合。當應用了IoC,一個對象依賴的其它對象會通過被

動的方式傳遞進來,而不是這個對象自己創建或者查找依賴對象。你可以認爲IoC與JNDI相反——不是對象從容器中查找依賴,而是

容器在對象初始化時不等對象請求就主動將依賴傳遞給它。

       面向切面——Spring提供了面向切面編程的豐富支持,允許通過分離應用的業務邏輯與系統級服務(例如審計(auditing)和

事務(transaction)管理)進行內聚性的開發。應用對象只實現它們應該做的——完成業務邏輯——僅此而已。它們並不負責(甚

至是意識)其它的系統級關注點,例如日誌或事務支持。

       容器——Spring包含並管理應用對象的配置和生命週期,在這個意義上它是一種容器,你可以配置你的每個bean如何被創

建——基於一個可配置原型(prototype),你的bean可以創建一個單獨的實例或者每次需要時都生成一個新的實例——以及它們是

如何相互關聯的。然而,Spring不應該被混同於傳統的重量級的EJB容器,它們經常是龐大與笨重的,難以使用。

       框架——Spring可以將簡單的組件配置、組合成爲複雜的應用。在Spring中,應用對象被聲明式地組合,典型地是在一個XML

文件裏。Spring也提供了很多基礎功能(事務管理、持久化框架集成等等),將應用邏輯的開發留給了你。

       MVC——Spring的作用是整合,但不僅僅限於整合,Spring 框架可以被看做是一個企業解決方案級別的框架。客戶端發送請

求,服務器控制器(由DispatcherServlet實現的)完成請求的轉發,控制器調用一個用於映射的類HandlerMapping,該類用於將請求

映射到對應的處理器來處理請求。HandlerMapping 將請求映射到對應的處理器Controller(相當於Action)在Spring 當中如果寫一

些處理器組件,一般實現Controller 接口,在Controller 中就可以調用一些Service 或DAO 來進行數據操作 ModelAndView 用於存放

從DAO 中取出的數據,還可以存放響應視圖的一些數據。 如果想將處理結果返回給用戶,那麼在Spring 框架中還提供一個視圖組

件ViewResolver,該組件根據Controller 返回的標示,找到對應的視圖,將響應response 返回給用戶。


所有Spring的這些特徵使你能夠編寫更乾淨、更可管理、並且更易於測試的代碼。它們也爲Spring中的各種模塊提供了基礎支持。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章