Spring不只能夠建立實列,並且能夠爲實列設置屬性值,這種由Spring容器設置屬性的方式被稱爲控制反轉。使用依賴注入,不只能夠爲Bean注入普通屬性,還能夠注入其餘Bean的引用。經過這種依賴注入,Java EE應用中的各類組件不須要以硬編碼方式耦合在一塊兒,甚至無須使用工廠模式。設計模式
無論是依賴注入仍是控制反轉,其含義徹底相同:當某個Java實列須要另外一個Java實列時,一般由調用者來建立被調用者的實列。在依賴注入的模式下,建立被調用者的工做再也不由調用者來完成,所以被稱爲控制反轉。建立被調用者的實列交由Spring來完成,而後注入調用者,所以也被稱爲依賴注入。編碼
舉個列子理解依賴注入:一我的(JAVA實列,調用者)須要一把斧子(JAVA實列,被調用者)設計
在原始社會中,須要斧子的人(調用者)只能本身去打造一把斧子(被調用者)。對應的情形就是:Java程序裏的調用者本身建立被調用者,一般採用new關鍵字構造一個被調用者實列,此時須要還要關注被調用者的產生。在這種模式下,可擴展性差。人與斧子組件高度耦合,當程序擴展斧子組件時,人的組件也須要改變。各組件職責不清,對於人而言,只需調用斧子便可,無須關心斧子的建立過程。接口
在工業社會中,工廠出現了,斧子再也不須要人們完成,而是直接在工廠中產生。此時須要斧子的人(調用者)找到工廠,購買斧子,無須關心斧子的製造過程。對於簡單工廠設計模式,調用者只需定位工廠,無須管理被調用者具體的實現。在這種模式下,調用者無須關心被調用者的具體實現過程,只須要找到符合接口的實列,既可使用。可讓調用者與被調用者解耦合,可是調用者仍然須要主動定位工廠,調用者與工廠耦合在一塊兒。容器
在共產社會中,須要斧子的人甚至無須關注工廠,Spring容器已經提供好一切,等待Spring注入。這就是依賴注入。擴展
依賴注入一般有兩種方式:依賴注入
1)設置注入:IOC容器使用屬性的setter方法來注入被依賴的實列;引用
2)構造注入:IOC容器使用構造器來注入被依賴的實列;程序