1. 程式人生 > >Spring學習手札(三)理解IoC 拯救不開心

Spring學習手札(三)理解IoC 拯救不開心

  Inverse of Control,翻譯成“控制反轉”,是Spring的核心IoC不是一種技術,而是一種設計思想。就是將原本在程式中手動建立物件的控制權(new Object() ),交由Spring容器來管理控制。不用new物件,直接從Spring那裡獲取一個物件(其內部使用的是反射技術)。

   如此,引入下面幾個問題:

       誰控制,控制了什麼?傳統程式設計中,比如,我需要物件A,那麼我通常的做法是 A a = new A(); 需要我主動建立物件A。而如今,IoC會有一個專門容器來建立物件,或者說是由IoC容器來控制物件的建立,我不需要它是怎麼建立,什麼時候建立,以及建立的方式還有銷燬等,我只要它給我A,也就是說它控制了我對外部資源的獲取。

       為什麼反轉?比如,物件A,依賴物件B,以前的做法是在例項化A後,再例項化B,然後將B賦予A,也就是說需要我手動建立依賴物件,是正轉。而如今,容器會幫助我查詢並注入依賴物件,物件只是被動的接受依賴物件,是反轉,獲取依賴物件的動作反轉了。當然,我也不需要關心B是怎麼建立,什麼時候建立,以及建立的方式還有銷燬等。好萊塢法則“ Don't call me ,i will call you.”

       IoC改變了什麼?以前是 I am the King,you are my queen,一切由我主宰,而引入IoC/DI,從思想上扭轉“主從換位”。在應用程式上換位,在開發中,我需要什麼,要獲取什麼資源都交由IoC容器來建立並注入我所需的資源

   那麼,IoC/DI給我們帶來了什麼?

       首先,IoC的引入,將以前的依賴關係發生倒置。所有的類都會在Spring容器中標記,告訴Spring什麼實體,什麼描述,而Spring會在適當的時候把這個類交給開發人員。所有這些類有關的建立,銷燬都由Spring控制,以及物件的生存週期不再由開發人員操作,全權交由Spring控制,這便是控制反轉。(有人稱呼為“反轉控制”更加字面化理解)

       其次,DI的是實現是I o C的一項工作了,IoC的一個重點就是在系統執行中,動態的向某物件提供它所需要的其他物件,並注入其內。或者說,獲取依賴物件的方式反轉了。

       網上有個找女朋友的段子,很適合IoC/DI的解釋。我想找個女朋友,首先,我要new 女(),她的性別必須是女,然後我有其他要求了,身高,體重,還有她的電話號,微訊號,部落格,工作,家庭…然後(此處省去N個字)。而現在不一樣了,我想找女朋友,我不用絞盡腦汁,與茫茫人海中,遇到最合適的那個人,我要做的是將上面的要求列表,叫給婚姻介紹所或者媒婆,他們會有個美女列表(容器),幫我匹配姑娘,而我只需跟她聊聊天,喝喝茶,看看電影,談個戀愛,結婚…這就是IoC。另外,姑娘出門還要精心打扮一番,找Tony老師設計下頭髮,胭脂口紅什麼的,不然不出門。當然,這些對與我來說不需要知道,我看到的符合要求的打扮漂亮的姑娘站在我面前,跟我約會,這就是DI。

  Spring提供IoC容器,管理開發的各種各樣的Bean。主要是基於兩個介面:

         BeanFactory

         ApplicationContext (繼承自BeanFactory)

  由於這個介面的重要性,所以有必要在這裡作一下簡短的說明:

  【getBean】對應了多個方法來獲取配置給Spring IoC 容器的Bean。    ①按照型別拿bean:      bean = (Bean) factory.getBean(Bean.class);      注意:要求在配置中,只能有一個這種型別的例項,否則會報錯    ②按照bean 的名字拿bean:      bean = (Bean) factory.getBean("beanName");      注意:這種方法不太安全,IDE 不會檢查其安全性(關聯性)    ③按照名字和型別拿bean:(推薦)      bean = (Bean) factory.getBean("beanName", Bean.class);

  【isSingleton】用於判斷是否單例,如果判斷為真,其意思是該Bean 在容器中是作為一個唯一單例存在的。而【isPrototype】則相反,如果判斷為真,意思是當你從容器中獲取Bean,容器就為你生成一個新的例項。注意:在預設情況下,【isSingleton】為ture,而【isPrototype】為false

   關於type 的匹配,這是一個按Java 型別匹配的方式

  【getAliases】方法是獲取別名的方法

  ApplicationContext常見類

         ClassPathXmlApplicationContext,讀取ClassPath中的資源

         FileSystemXmlApplicationContext,讀取指定路徑下的資源

         XmlWebApplicationContext,需要在web環境中才能執行

BeanFactory ApplicationContext 的區別:

  • BeanFactory是Spring中最底層的介面,只提供了最簡單的IoC功能,負責配置,建立和管理bean。應用中,一般不使用BeanFactory,而推薦使用ApplicationContext(應用上下文),原因如下。
  • ApplicationContext1.繼承了BeanFactory,擁有了基本的IoC 功能;2.除此之外,ApplicationContext 還提供了以下功能:

    ①支援國際化;    ②支援訊息機制;    ③支援統一的資源載入;    ④支援AOP功能;