Soring IOC和DI

在網上看了好多描述IOC和DI和文章,但感覺看他們的描述總感覺差點意思,所以我個人也總結了一些相關的概念,希望對面試或愛學習的小夥伴共勉。

 

IoC 和 DI:

IoC (Inversion of Control):

大家常說就是控制反轉。然而ioc不是一種新的技術,而是 Spring 的一種設計思想,這個相信大家使用過的小夥伴都應該知道。

何爲ICO?

在傳統的程序設計,我們直接在對象內部通過 new 來創建對象,是程序主動去創建依賴對象;而在 Spring 中有專門的一個容器來創建和管理這些對象,並將對象依賴的其他對象注入到該對象中,這個容器我們一般稱爲 IoC 容器。

所有的類的創建、銷燬都由 Spring 來控制,也就是說控制對象生存週期的不再是引用它的對象,而是 Spring。對於某個具體的對象而言,以前是它控制其他對象,現在是所有對象都被 Spring 控制,所以這就叫控制反轉。面試時這麼說應該就非常完美了,千萬不要說的太直白哦。

DI(Dependency Injection):

DI即依賴注入,是由 Martin Fowler 提出(百度來的哈哈)。可以認爲 IoC 和 DI 其實是同一個概念的不同角度描述。

依賴注入是指組件之間的依賴關係由容器在運行期決定,形象的說,即由容器動態的將某個依賴關係注入到組件之中。依賴注入的目的並非爲軟件系統帶來更多功能,而是爲了提升組件重用的頻率,併爲系統搭建一個靈活、可擴展的平臺。

通過依賴注入機制,我們只需要通過簡單的配置,而無需任何代碼就可指定目標需要的資源,完成自身的業務邏輯,而不需要關心具體的資源來自何處,由誰來實現。

何爲bean ?

官方概念描述:在 Spring 中,構成應用程序主幹並由 Spring IoC 容器管理的對象稱爲 bean。bean 是一個由 Spring IoC 容器實例化,組裝和管理的對象。

大白話來說:bean 可以認爲是那些我們想注入到 Spring IoC 容器的 Java 對象實例的抽象。

我們經常會在 Service 上使用 @Service 註解,然後在要使用該 Service 的類中通過 @Autowire或者@Resource 註解來注入,這個 Service 就是一個 bean。在這個地方,@Service 註解相當於告訴 IoC 容器:這個類你需要幫我創建和管理;而 @Autowire 註解相當於告訴 IoC 容器:我需要依賴這個類,你需要幫我注入進來。

BeanDefinition

當你理解了 bean,BeanDefinition 就比較容易理解了。BeanDefinition 是 bean 的定義,用來存儲 bean 的所有屬性方法定義。

BeanFactory 和 ApplicationContext

BeanFactory:基礎類型 IoC 容器,提供完整的 IoC 服務支持。

ApplicationContext:BeanFactory 的子接口,在 BeanFactory 的基礎上構建,是相對比較高級的 IoC 容器實現。包含 BeanFactory 的所有功能,還提供了其他高級的特性,比如:事件發佈、國際化信息支持、統一資源加載策略等。正常情況下,我們都是使用的 ApplicationContext。

以電話來舉例:

我們家裏使用的 “座機” 就類似於 BeanFactory,可以進行電話通訊,滿足了最基本的需求。

而現在非常普及的智能手機,蘋果手機、華爲等,就類似於 ApplicationContext,除了能進行電話通訊,還有其他很多功能:視頻、拍照、聽歌等。

FactoryBean

一般情況下,我們將 bean 的創建和管理都交給 Spring IoC 容器,Spring 會利用 bean 的 class 屬性指定的類來實例化 bean。

但是如果我們想自己實現 bean 的創建操作,可以實現嗎?答案是可以的,FactoryBean 就可以實現這個需求。

FactoryBean 是一種特殊的 bean,它是個工廠 bean,可以自己創建 bean 實例,如果一個類實現了 FactoryBean 接口,則該類可以自己定義創建實例對象的方法,只需要實現它的 getObject() 方法即可。

FactoryBean 可能對於普通開發來說基本用不到也沒去注意過,但是它其實應用的非常廣,特別是在中間件中,如果你看過一些中間件的源碼,一定會看到 FactoryBean 的身影。

 

 

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