1. 程式人生 > >Spring IOC Spring IOC的理解

Spring IOC Spring IOC的理解

Spring IOC的理解

  學習過Spring框架的人一定都會聽過Spring的IoC(控制反轉) 、DI(依賴注入)這兩個概念,對於初學Spring的人來說,總覺得IoC 、DI這兩個概念是模糊不清的,是很難理解的,今天和大家分享網上的一些技術大牛們對Spring框架的IOC的理解以及談談我對Spring Ioc的理解。

一、分享Iteye的開濤對Ioc的精彩講解

  首先要分享的是Iteye的開濤這位技術牛人對Spring框架的IOC的理解,寫得非常通俗易懂,以下內容全部來自原文,原文地址:http://jinnianshilongnian.iteye.com/blog/1413846

1.1、IoC是什麼

  Ioc—Inversion of Control,即“控制反轉”,不是什麼技術,而是一種設計思想。在Java開發中,Ioc意味著將你設計好的物件交給容器控制,而不是傳統的在你的物件內部直接控制。如何理解好Ioc呢?理解好Ioc的關鍵是要明確“誰控制誰,控制什麼,為何是反轉(有反轉就應該有正轉了),哪些方面反轉了”,那我們來深入分析一下:

  ●誰控制誰,控制什麼:傳統Java SE程式設計,我們直接在物件內部通過new進行建立物件,是程式主動去建立依賴物件;而IoC是有專門一個容器來建立這些物件,即由Ioc容器來控制對 象的建立;誰控制誰?當然是IoC 容器控制了物件;控制什麼?那就是主要控制了外部資源獲取(不只是物件包括比如檔案等)。

  ●為何是反轉,哪些方面反轉了:有反轉就有正轉,傳統應用程式是由我們自己在物件中主動控制去直接獲取依賴物件,也就是正轉;而反轉則是由容器來幫忙建立及注入依賴物件;為何是反轉?因為由容器幫我們查詢及注入依賴物件,物件只是被動的接受依賴物件,所以是反轉;哪些方面反轉了?依賴物件的獲取被反轉了。

  用圖例說明一下,傳統程式設計如圖2-1,都是主動去建立相關物件然後再組合起來:

圖1-1 傳統應用程式示意圖

  當有了IoC/DI的容器後,在客戶端類中不再主動去建立這些物件了,如圖2-2所示:

圖1-2有IoC/DI容器後程序結構示意圖

1.2、IoC能做什麼

  IoC 不是一種技術,只是一種思想,一個重要的面向物件程式設計的法則,它能指導我們如何設計出鬆耦合、更優良的程式。傳統應用程式都是由我們在類內部主動建立依賴物件,從而導致類與類之間高耦合,難於測試;有了IoC容器後,把建立和查詢依賴物件的控制權交給了容器,由容器進行注入組合物件,所以物件與物件之間是 鬆散耦合,這樣也方便測試,利於功能複用,更重要的是使得程式的整個體系結構變得非常靈活。

  其實IoC對程式設計帶來的最大改變不是從程式碼上,而是從思想上,發生了“主從換位”的變化。應用程式原本是老大,要獲取什麼資源都是主動出擊,但是在IoC/DI思想中,應用程式就變成被動的了,被動的等待IoC容器來建立並注入它所需要的資源了。

  IoC很好的體現了面向物件設計法則之一—— 好萊塢法則:“別找我們,我們找你”;即由IoC容器幫物件找相應的依賴物件並注入,而不是由物件主動去找。

1.3、IoC和DI

  DI—Dependency Injection,即“依賴注入”元件之間依賴關係由容器在執行期決定,形象的說,即由容器動態的將某個依賴關係注入到元件之中依賴注入的目的並非為軟體系統帶來更多功能,而是為了提升元件重用的頻率,併為系統搭建一個靈活、可擴充套件的平臺。通過依賴注入機制,我們只需要通過簡單的配置,而無需任何程式碼就可指定目標需要的資源,完成自身的業務邏輯,而不需要關心具體的資源來自何處,由誰實現。

  理解DI的關鍵是:“誰依賴誰,為什麼需要依賴,誰注入誰,注入了什麼”,那我們來深入分析一下:

  ●誰依賴於誰:當然是應用程式依賴於IoC容器

  ●為什麼需要依賴:應用程式需要IoC容器來提供物件需要的外部資源

  ●誰注入誰:很明顯是IoC容器注入應用程式某個物件,應用程式依賴的物件

  ●注入了什麼:就是注入某個物件所需要的外部資源(包括物件、資源、常量資料)

  IoC和DI由什麼關係呢?其實它們是同一個概念的不同角度描述,由於控制反轉概念比較含糊(可能只是理解為容器控制物件這一個層面,很難讓人想到誰來維護物件關係),所以2004年大師級人物Martin Fowler又給出了一個新的名字:“依賴注入”,相對IoC 而言,依賴注入”明確描述了“被注入物件依賴IoC容器配置依賴物件”。

  看過很多對Spring的Ioc理解的文章,好多人對Ioc和DI的解釋都晦澀難懂,反正就是一種說不清,道不明的感覺,讀完之後依然是一頭霧水,感覺就是開濤這位技術牛人寫得特別通俗易懂,他清楚地解釋了IoC(控制反轉) 和DI(依賴注入)中的每一個字,讀完之後給人一種豁然開朗的感覺。我相信對於初學Spring框架的人對Ioc的理解應該是有很大幫助的。

二、分享Bromon的blog上對IoC與DI淺顯易懂的講解

2.1、IoC(控制反轉)

  首先想說說IoC(Inversion of Control,控制反轉)。這是spring的核心,貫穿始終。所謂IoC,對於spring框架來說,就是由spring來負責控制物件的生命週期和物件間的關係。這是什麼意思呢,舉個簡單的例子,我們是如何找女朋友的?常見的情況是,我們到處去看哪裡有長得漂亮身材又好的mm,然後打聽她們的興趣愛好、qq號、電話號、ip號、iq號………,想辦法認識她們,投其所好送其所要,然後嘿嘿……這個過程是複雜深奧的,我們必須自己設計和麵對每個環節。傳統的程式開發也是如此,在一個物件中,如果要使用另外的物件,就必須得到它(自己new一個,或者從JNDI中查詢一個),使用完之後還要將物件銷燬(比如Connection等),物件始終會和其他的介面或類藕合起來。

  那麼IoC是如何做的呢?有點像通過婚介找女朋友,在我和女朋友之間引入了一個第三者:婚姻介紹所。婚介管理了很多男男女女的資料,我可以向婚介提出一個列表,告訴它我想找個什麼樣的女朋友,比如長得像李嘉欣,身材像林熙雷,唱歌像周杰倫,速度像卡洛斯,技術像齊達內之類的,然後婚介就會按照我們的要求,提供一個mm,我們只需要去和她談戀愛、結婚就行了。簡單明瞭,如果婚介給我們的人選不符合要求,我們就會丟擲異常。整個過程不再由我自己控制,而是有婚介這樣一個類似容器的機構來控制。Spring所倡導的開發方式就是如此,所有的類都會在spring容器中登記,告訴spring你是個什麼東西,你需要什麼東西,然後spring會在系統執行到適當的時候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的建立、銷燬都由 spring來控制,也就是說控制物件生存週期的不再是引用它的物件,而是spring。對於某個具體的物件而言,以前是它控制其他物件,現在是所有物件都被spring控制,所以這叫控制反轉。

2.2、DI(依賴注入)

  IoC的一個重點是在系統執行中,動態的向某個物件提供它所需要的其他物件。這一點是通過DI(Dependency Injection,依賴注入)來實現的。比如物件A需要操作資料庫,以前我們總是要在A中自己編寫程式碼來獲得一個Connection物件,有了 spring我們就只需要告訴spring,A中需要一個Connection,至於這個Connection怎麼構造,何時構造,A不需要知道。在系統執行時,spring會在適當的時候製造一個Connection,然後像打針一樣,注射到A當中,這樣就完成了對各個物件之間關係的控制。A需要依賴 Connection才能正常執行,而這個Connection是由spring注入到A中的,依賴注入的名字就這麼來的。那麼DI是如何實現的呢? Java 1.3之後一個重要特徵是反射(reflection),它允許程式在執行的時候動態的生成物件、執行物件的方法、改變物件的屬性,spring就是通過反射來實現注入的。

  理解了IoC和DI的概念後,一切都將變得簡單明瞭,剩下的工作只是在spring的框架中堆積木而已。

三、我對IoC(控制反轉)和DI(依賴注入)的理解

  在平時的java應用開發中,我們要實現某一個功能或者說是完成某個業務邏輯時至少需要兩個或以上的物件來協作完成,在沒有使用Spring的時候,每個物件在需要使用他的合作物件時,自己均要使用像new object() 這樣的語法來將合作物件創建出來,這個合作物件是由自己主動創建出來的,建立合作物件的主動權在自己手上,自己需要哪個合作物件,就主動去建立,建立合作物件的主動權和建立時機是由自己把控的,而這樣就會使得物件間的耦合度高了,A物件需要使用合作物件B來共同完成一件事,A要使用B,那麼A就對B產生了依賴,也就是A和B之間存在一種耦合關係,並且是緊密耦合在一起,而使用了Spring之後就不一樣了,建立合作物件B的工作是由Spring來做的,Spring建立好B物件,然後儲存到一個容器裡面,當A物件需要使用B物件時,Spring就從存放物件的那個容器裡面取出A要使用的那個B物件,然後交給A物件使用,至於Spring是如何建立那個物件,以及什麼時候建立好物件的,A物件不需要關心這些細節問題(你是什麼時候生的,怎麼生出來的我可不關心,能幫我幹活就行),A得到Spring給我們的物件之後,兩個人一起協作完成要完成的工作即可。

  所以控制反轉IoC(Inversion of Control)是說建立物件的控制權進行轉移,以前建立物件的主動權和建立時機是由自己把控的,而現在這種權力轉移到第三方,比如轉移交給了IoC容器,它就是一個專門用來建立物件的工廠,你要什麼物件,它就給你什麼物件,有了 IoC容器,依賴關係就變了,原先的依賴關係就沒了,它們都依賴IoC容器了,通過IoC容器來建立它們之間的關係。

  這是我對Spring的IoC(控制反轉)的理解。DI(依賴注入)其實就是IOC的另外一種說法,DI是由Martin Fowler 在2004年初的一篇論文中首次提出的。他總結:控制的什麼被反轉了?就是:獲得依賴物件的方式反轉了。

四、小結

  對於Spring Ioc這個核心概念,我相信每一個學習Spring的人都會有自己的理解。這種概念上的理解沒有絕對的標準答案,仁者見仁智者見智。如果有理解不到位或者理解錯的地方,歡迎廣大園友指正!

  學習過Spring框架的人一定都會聽過Spring的IoC(控制反轉) 、DI(依賴注入)這兩個概念,對於初學Spring的人來說,總覺得IoC 、DI這兩個概念是模糊不清的,是很難理解的,今天和大家分享網上的一些技術大牛們對Spring框架的IOC的理解以及談談我對Spring Ioc的理解。

一、分享Iteye的開濤對Ioc的精彩講解

  首先要分享的是Iteye的開濤這位技術牛人對Spring框架的IOC的理解,寫得非常通俗易懂,以下內容全部來自原文,原文地址:http://jinnianshilongnian.iteye.com/blog/1413846

1.1、IoC是什麼

  Ioc—Inversion of Control,即“控制反轉”,不是什麼技術,而是一種設計思想。在Java開發中,Ioc意味著將你設計好的物件交給容器控制,而不是傳統的在你的物件內部直接控制。如何理解好Ioc呢?理解好Ioc的關鍵是要明確“誰控制誰,控制什麼,為何是反轉(有反轉就應該有正轉了),哪些方面反轉了”,那我們來深入分析一下:

  ●誰控制誰,控制什麼:傳統Java SE程式設計,我們直接在物件內部通過new進行建立物件,是程式主動去建立依賴物件;而IoC是有專門一個容器來建立這些物件,即由Ioc容器來控制對 象的建立;誰控制誰?當然是IoC 容器控制了物件;控制什麼?那就是主要控制了外部資源獲取(不只是物件包括比如檔案等)。

  ●為何是反轉,哪些方面反轉了:有反轉就有正轉,傳統應用程式是由我們自己在物件中主動控制去直接獲取依賴物件,也就是正轉;而反轉則是由容器來幫忙建立及注入依賴物件;為何是反轉?因為由容器幫我們查詢及注入依賴物件,物件只是被動的接受依賴物件,所以是反轉;哪些方面反轉了?依賴物件的獲取被反轉了。

  用圖例說明一下,傳統程式設計如圖2-1,都是主動去建立相關物件然後再組合起來:

圖1-1 傳統應用程式示意圖

  當有了IoC/DI的容器後,在客戶端類中不再主動去建立這些物件了,如圖2-2所示:

相關推薦

理解Spring中的IOC和AOP

nfa 重復 高度 只需要 spring框架 aop 編程 靈活 攔截 我們是在使用Spring框架的過程中,其實就是為了使用IOC,依賴註入和AOP,面向切面編程,這兩個是Spring的靈魂。 主要用到的設計模式有工廠模式和代理模式 IOC就是典型的工廠模式,通過se

Spring IOC的個人理解Spring對bean的裝配

IOC是什麼? IOC的英文全稱是Inversion of Control,即控制反轉。IOC並不是什麼技術,而是一種設計思想。 IOC有什麼好處,或者說你怎麼理解控制反轉? 這是恐怕是面試官對於Spring框架的問題中最為常見的一個問題了。 歷史遺留問題:在平時我們開發J

springIOC的簡單理解

之前看了一下原始碼,看的挺吃力,只能是慢慢看了。 簡單說一下springIOC的我的理解,IOC也叫控制反轉,可以有效的減低各個元件之間的耦合度 想象一下,如果不用IOC,那麼系統裡面會有大量的new 的物件,這些物件什麼時候建立什麼時候銷燬,哪些裡面有資料,想想就覺得很亂對不對。 然後IOC就出來了,

【死磕 Spring】----- IOC 之深入理解 Spring IoC

在一開始學習 Spring 的時候,我們就接觸 IoC 了,作為 Spring 第一個最核心的概念,我們在解讀它原始碼之前一定需要對其有深入的認識,本篇為【死磕 Spring】系列部落格的第一篇博文,主要介紹 IoC 基本概念和各個元件。 IOC 理論 Io

Spring中的IOC(控制反轉)與DI(依賴注入)理解由淺入深-適用於小白

IOC(Inversion of Control )與 DI(Dependency injection)是sping的主要思想,不是技術! IOC控制反轉:一般我們在一個類中呼叫其它的類(非靜態類),需要新建一個該類的例項或者從其他途徑獲取該類的例項,然後對通過該例項進行操

淺談對Spring IOC容器的理解

看過很多關於Ioc容器的文章,自我理解。 首先,Ioc即“控制反轉”,是一種設計思想。 1、在Java開發中,Ioc意味著將你設計好的物件交給容器控制,而不是傳統的在你的物件內部直接控制。 2、傳統Java SE程式設計,我們直接在物件內部通過new進行建立物件,是程式

spring框架 IOC容器的理解

一. IoC理論的背景   我們都知道,在採用面向物件方法設計的軟體系統中,它的底層實現都是由N個物件組成的,所有的物件通過彼此的合作,最終實現系統的業務邏輯。   如果我們開啟機械式手錶的後蓋,就會看到與上面類似的情形,各個齒輪分別帶動時針、分針和秒針順時針旋轉,從而在錶盤上產生正確

控制反轉IOC的依賴注入方式 【調侃】IOC前世今生 IoC模式 談談對Spring IOC理解 一個簡單的小程式演示Unity的三種依賴注入方式 小菜學習設計模式(五)—控制反轉(IocIoC模式(依賴、依賴倒置、依賴注入、控制反轉) IoC模式

轉自:https://www.cnblogs.com/ysyn/p/5563256.html 引言:    專案中遇到關於IOC的一些內容,因為和正常的邏輯程式碼比較起來,IOC有點反常。因此本文記錄IOC的一些基礎知識,並附有相應的簡單例項,而在實際專案中再複雜的應用也只是在

如何理解spring中的IOC(控制反轉)、DI(依賴注入)?

如何理解IOC(控制反轉)和DI(依賴注入) ioc是什麼? Ioc—Inversion of Control,即“控制反轉”,不是什麼技術,而是一種設計思想。在Java開發中,Ioc意味著將你設計好的物件交給容器控制,而不是傳統的在你的物件內部直接控制。如

Spring IOC Spring IOC理解

Spring IOC的理解   學習過Spring框架的人一定都會聽過Spring的IoC(控制反轉) 、DI(依賴注入)這兩個概念,對於初學Spring的人來說,總覺得IoC 、DI這兩個概念是模糊不清的,是很難理解的,今天和大家分享網上的一些技術大牛們對Sp

[轉]開源框架Spring詳解---IoC的深刻理解

有一段時間沒有接觸spring了,感覺有點陌生了,今天總結了一下關於IoC的一些知識點,雖然是學過spring了,但是如果不經常使用,知識點是連線不起來的。所以今天我特意做了這個總結。相信對大家有一定的幫助。以便我們可以共同學習,共同進步。 Ioc的理解 1、依賴注入的概念 spring的兩個核心概念:一個

spring Ioc 容器深入理解

IoC 概述     IOC是spring的核心,Aop、宣告式事務都能功能都依賴於此功能,它涉及程式碼解耦,設計模式,程式碼優化的問題的考量。 ioc的初步理解     ioc的概念重要但比較晦澀難懂,如下通過一個小例子來說明這個概念:     示例場景:電影

Spring AOP詳解 (轉) 以及IOC(個人理解

  先了解AOP的相關術語:1.通知(Advice):通知定義了切面是什麼以及何時使用。描述了切面要完成的工作和何時需要執行這個工作。2.連線點(Joinpoint):程式能夠應用通知的一個“時機”,這些“時機”就是連線點,例如方法被呼叫時、異常被丟擲時等等。3.切入點(Pointcut)通知定義了切面要發生

對於Spring中AOP,DI,IoC概念的理解

IOC IoC(inversion of Control),控制反轉。就好像敏捷開發和SCRUM一樣,不是什麼技術,而是一種方法論,一種工程化的思想。使用IoC的思想意味著你將設計好的物件交給容器控制,而不是傳統的在你的物件內部直接控制。 為什麼要控制反轉呢,誰在控制誰呢,反轉了什麼東西呢?這篇筆記聊的就是

小敘Spring.NET(Ioc與DI)的使用步驟

寫入 邏輯 麻煩 今天 人員 feature 屬性註入 節點 問題 那今天就介紹一下我理解的Spring.net吧。介紹Spring.NET之前,先談點其他的。我們都知道,.NET有一個基本原則“高內聚,低耦合“。關於這個概念,想必大家都知道。所謂高內聚,也就

Spring 中的IOC和DI

註入 機制 容器 返回 其他 工作 一個 請求 功能 IOC是一種叫做“控制反轉”的設計思想。 1、較淺的層次——從名字上解析 “控制”就是指對 對象的創建、維護、銷毀等生命周期的控制,這個過程一般是由我們的程序去主動控制的,如使用new關鍵字去創建一個對象(創建),在使用

Spring 學習 2- IOC原理 控制反轉/依賴註入

情況 map return obj 這一 運行 spring入門 lan 設計 控制反轉/依賴註入 最近,買了本spring入門書:spring In Action 。大致瀏覽了下感覺還不錯。就是入門了點。Manning的書還是不錯的,我雖然不像哪些只看Mannin

使用Spring.NET的IoC容器

frame 管理 sdn detail lns string creat ack mod 使用Spring.NET的IoC容器 0. 輔助類庫 using System; using System.Collections.Generic; using System.Lin

Spring框架[一]——spring概念和ioc入門(ioc操作xml配置文件)

修改 數組 名稱空間 springmvc jdbc ack 靜態 spring框架 鍵值 Spring概念 spring是開源的輕量級框架(即不需要依賴其他東西,可用直接使用) spring核心主要兩部分 aop:面向切面編程,擴展功能不是修改源代碼來

Spring框架——關於IOC容器和註解的36個小實驗

web beans count 註入 定義 目標 初始化 getc pan 實驗1:通過IOC容器創建對象,並為屬性賦值★ <bean id="page" class="com.neuedu.Bean.Page"> <property name="f