? ? ? ? Spring框架是為了簡化企業級應用開發而創建的,其強大之處在于對Java SE和Java EE開發進行全方位的簡化,Spring還對常用的功能進行封裝,可以極大地提高Java EE的開發效率。
? ? ? ? 依賴注入是Spring的核心技術之一,也被稱為“控制反轉”,借助依賴注入技術,我們可以很方便地實現調用者和被調用者的分解,解耦類與類之間的關系。
? ? ? ? 依賴注入(DI)指組件之間依賴關系由容器在運行期決定,即由容器動態地將某個依賴關系注入到組件之中。依賴注入的目的并非為軟件系統帶來更多功能,而是為了提高組件重用的頻率,并為系統搭建一個靈活、可擴展的平臺。通過依賴注入機制,我們只需要通過簡單的配置,而無須修改任何代碼,也無需在意資源來自何處、由誰實現,就可以指定目標需要的資源,完成自身的業務邏輯。
? ? ? ? 控制反轉(IoC)并不是什么具體的技術,而是一種設計思想。在Java開發中通過IoC,將原本由程序代碼直接操控的組件對象交由容器來操控,通過容器來實現組件對象的裝配和管理。所謂“控制反轉”概念就是對組件對象控制權的轉移,從程序代碼本身轉移到了外部容器。
? ? ? ? 依賴注入和控制反轉是同一個概念的不同角色描述,由于控制反轉概念比較含糊(可能只是理解到容器控制對象這一個層面,很難讓人想到由誰來維護對象關系),所以2004年Martin Fowler又給出了一個新的名字——依賴注入。相對控制反轉而言,依賴注入明確描述了“被注入對象依賴控制反轉容器來配置依賴對象”。依賴注入的具體含義是:當某個角色(調用者,可能是一個Java實例)需要另一個角色(被調用者,另一個Java實例)的協助時,在傳統的程序設計過程中,通常由調用者來創建被調用者的實例。但在Spring中,被調用者的創建工作不再由調用者來完成,因此這也被稱作控制反轉;被調用者實例的創建工作通常由Spring容器來完成,因此這也被稱作依賴注入。
? ? ? ? 在編寫傳統的Java應用代碼時,我們一般是直接在對象內部通過new來創建對象,讓程序主動去創建依賴對象,這就是一個“誰使用,誰創建”的過程,創建依賴對象的主動權和創建時機都是由自己來把控。
? ? ? ? 下面用示例來說明傳統的Java應用代碼是怎么來創建對應并使用對象中的屬性和方法。
? ? ? ? 首先創建一個Demo1.java類,該類的代碼如下所示
package com.example.servlet001;public class Demo1 {public static void main(String[] args) {Person person=new Person();person.sayHello();}}class Person{public void sayHello(){System.out.println("hello");}}
? ? ? ? 運行該類后的輸出如下圖所示
? ? ? ? 可以看到Demo1類和Person類之間存在著強耦合,Person類和方法修改時,Demo1類的代碼也需要修改。
? ? ? ? 而在Spring中,可以通過IoC容器動態地將某個依賴關系注入到組件之中。
? ? ? Spring有兩個重要的接口:BeanFactory和ApplicationContext,所謂的容器就是實現了BeanFactory接口或者是ApplicationContext接口的類的實例,BeanFactory是最頂層、最基本的接口,它描述了容器需要實現的最基本的功能,比如對象的注冊、獲取等。
? ? ? ? ApplicationContext接口繼承了BeanFactory接口,擁有BeanFactory接口的全部功能,還繼承了ApplicationEventPublisher接口、ResourceLoader接口、MessageSource接口,提供應用事件發布、資源加載和國際化功能。在實際應用中,這些功能使得ApplicationContext接口比BeanFactory接口更加方便。