Inverse of Control,翻譯成「控制反轉」,是Spring的核心。IoC不是一種技術,而是一種設計思想。就是將本來在程序中手動建立對象的控制權(new Object() ),交由Spring容器來管理控制。不用new對象,直接從Spring那裏獲取一個對象(其內部使用的是反射技術)。web
如此,引入下面幾個問題:編程
誰控制,控制了什麼?傳統編程中,好比,我須要對象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容器來建立並注入我所需的資源。spa
那麼,IoC/DI給咱們帶來了什麼?翻譯
首先,IoC的引入,將之前的依賴關係發生倒置。全部的類都會在Spring容器中標記,告訴Spring什麼實體,什麼描述,而Spring會在適當的時候把這個類交給開發人員。全部這些類有關的建立,銷燬都由Spring控制,以及對象的生存週期再也不由開發人員操做,全權交由Spring控制,這即是控制反轉。(有人稱呼爲「反轉控制」更加字面化理解)設計
其次,DI的是實現是I o C的一項工做了,IoC的一個重點就是在系統運行中,動態的向某對象提供它所須要的其餘對象,並注入其內。或者說,獲取依賴對象的方式反轉了。對象
網上有個找女友的段子,很適合IoC/DI的解釋。我想找個女友,首先,我要new 女(),她的性別必須是女,而後我有其餘要求了,身高,體重,還有她的電話號,微信號,博客,工做,家庭…而後(此處省去N個字)。而如今不同了,我想找女友,我不用絞盡腦汁,與茫茫人海中,遇到最合適的那我的,我要作的是將上面的要求列表,叫給婚姻介紹所或者媒婆,他們會有個美女列表(容器),幫我匹配姑娘,而我只需跟她聊聊天,喝喝茶,看看電影,談個戀愛,結婚…這就是IoC。另外,姑娘出門還要精心打扮一番,找Tony老師設計下頭髮,胭脂口紅什麼的,否則不出門。固然,這些對與我來講不須要知道,我看到的符合要求的打扮漂亮的姑娘站在我面前,跟我約會,這就是DI。blog
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 的區別:
①支持國際化; ②支持消息機制; ③支持統一的資源加載; ④支持AOP功能;