控制反轉(zhuǎn),依賴注入,好萊塢原則
IoC 或者 DI 或者 …一大堆的縮寫詞
依賴注入和控制反轉(zhuǎn)其實是同一回事,依賴注入最典型的應(yīng)用就是控制反轉(zhuǎn)
不管是面向?qū)ο螅€是面向過程,都需要分成許多的塊,然后由這些部件協(xié)同工作完成任務(wù)
要協(xié)同工作就會產(chǎn)生依賴,一個方法調(diào)用另一個方法,一個對象包含另一個對象
如果對象A包含對象B的話,就需要在A里new一個B
依賴注入從具體類B里抽象出接口IB——IB的具體實現(xiàn)可能有很多B,B1,B2…很多種——這樣A可以不用再new具體的B了,而是跟IoC容器說:我要一個IB(getBean("IB"))。然后,由容器根據(jù)配置文件來做具體的new的工作。具體new的是哪個,由配置文件從代碼外部決定,要更換成B,B1,或是B2…修改配置文件就能做到,不用再改代碼了
例:
假設(shè)你編寫了兩個類,一個是人(Person),一個是手機(Mobile)。
人有時候需要用手機打電話,需要用到手機的dialUp方法。
傳統(tǒng)的寫法是這樣:








依賴注入的思想是這樣,當(dāng)一個類(Person)對另一個類(Mobile)有依賴時,不再該類(Person)內(nèi)部對依賴的類(Moblile)進行實例化,而是之前配置一個beans.xml,告訴容器所依賴的類(Mobile),在實例化該類(Person)時,容器自動注入一個所依賴的類(Mobile)的實例。
接口





Person類:











在xml文件中配置依賴關(guān)系








什么叫控制反轉(zhuǎn)呢?
套用好萊塢的一句名言就是:你呆著別動,到時我會找你。
什么意思呢?就好比一個皇帝和太監(jiān)
有一天皇帝想幸某個美女,于是跟太監(jiān)說,今夜我要寵幸美女
皇帝往往不會告訴太監(jiān),今晚幾點會回宮,會回哪張龍床,他只會告訴太監(jiān)他要哪位美女
其它一切都交由太監(jiān)去安排,到了晚上皇帝回宮時,自然會有美女出現(xiàn)在皇帝的龍床上
這就是控制反轉(zhuǎn),而把美女送到皇帝的寢宮里面去就是注射
太監(jiān)就是是框架里面的注射控制器類BeanFactory,負責(zé)找到美女并送到龍床上去
整個后宮可以看成是Spring框架,美女就是Spring控制下的JavaBean
而傳統(tǒng)的模式就是一個饑渴男去找小姐出臺
找領(lǐng)班,幫助給介紹一個云云,于是領(lǐng)班就開始給他張羅
介紹一個合適的給他,完事后,再把小姐還給領(lǐng)班,下次再來
這個過程中,領(lǐng)班就是查詢上下文Context,領(lǐng)班的一個職能就是給客戶找到他們所要的小姐
這就是lookup()方法,領(lǐng)班手中的小姐名錄就是JNDI//Java Naming and Directory Interface
小姐就是EJB,饑渴男是客戶端,青樓是EJB容器
看到區(qū)別了么?饑渴男去找小姐出臺很麻煩,不僅得找,用完后還得把小姐給還回去
而皇帝爽翻了,什么都不用管,交給太監(jiān)去處理,控制權(quán)轉(zhuǎn)移到太監(jiān)手中去了
而不是皇帝,必要時候由太監(jiān)給注射進去就可以了
看到Spring的美妙了吧,Spring還提供了與多個主流框架的支持
可以和其它開源框架集成
posted on 2010-07-19 11:21 常言笑 閱讀(1476) 評論(0) 編輯 收藏 所屬分類: 技術(shù)總結(jié)