Spring是一個開源框架,是一個輕量級的控制反轉(IOC)和面向切面(AOP)的容器框架。
原因:
(1)通過控制反轉(IOC)達到松耦合,IOC也就是把控制權交出去,在使用中直接得到對象
(2)提供了面向切面編程的豐富支持,允許通過分離應用的業務邏輯與系統級服務進行內聚性的開發(例如,商品的入庫和出庫是業務邏輯,而商品的入庫和出庫需要統一的日志記錄和事務的管理是系統服務,與具體的業務無關,也就是無論業務如何,都要用到系統服務)
(3)包含並管理應用對象的配置和生命周期,也就是容器的作用
(4)將簡單的組件配置、組合成為復雜的應用,也就是框架的作用
框架與類庫的區別:
(1)框架一般是封裝了邏輯、高內聚的,類庫則是松散的工具組合
(2)框架專注於某一領域,類庫則是更通用的
Spring是一系列輕量級Java EE框架的集合:核心容器,Spring上下文,Spring AOP, Spring DAO, Spring ORM, Spring Web, Spring MVC。
IOC:控制反轉,控制權的轉移,應用程序本身不負責依賴對象的創建和維護,而是由外部容器負責創建和維護,也就是不顯示的進行new創建對象
DI(依賴注入):是控制反轉的一種實現方式,由IOC容器在運行期間,動態地將某種依賴關系注入到對象之中。也就是獲得依賴對象的過程由自身管理變為由IOC容器主動注入。通過反射機制實現。
控制反轉:
控制反轉的目的:創建對象並組裝對象之間的關系。
IOC容器初始化時創建一系列對象,並把對象之間的依賴關系通過注入的方式組織起來,當一個類A中有另外一個B,實例化時,先實例化A這個對象,再實例化B這個對象,然后把B這個對象賦值給A,這就是IOC的組裝對象,具體如下圖
圖解:業務對象進入Spring容器,然后通過配置的元數據,生產出符合我們需要的對象,當我們需要用的時候,直接從Spring容器中取出來用即可,這也就是IOC,應用程序只關心對象的使用,而不關心對象的創建
在IOC容器中,把所有對象稱為Bean,Spring利用Bean來管理這些對象,Spring對於Bean和其他的使用有兩種方式,一種是基於xml的配置,一種是注解方式。
依賴注入:
借鑒http://blog.csdn.net/zhoudaxia/article/details/31763677
控制反轉:把傳統上由程序代碼直接操控的對象的調用權交給外部容器,通過容器來實現對象組件的裝配和管理。所謂的“控制反轉”就是組件對象的控制權轉移了,從程序代碼本身轉移到了外部容器。
實現控制反轉的兩種方式:依賴注入和依賴查找。
依賴注入有四種實現方式:
1.基於接口:實現特定接口以供外部容器注入所依賴類型的對象,接口中定義要注入依賴對象的方法。
2.基於setter方法:實現特定屬性的public set方法,來讓外部容器調用,以傳入所依賴類型的對象。
3.基於構造函數:實現特定參數的構造函數,在新建對象時傳入所依賴類型的對象。
4.基於注解:基於Java的注解功能,在私有變量前加“@Autowired"等注解,不需要顯式的定義以上三種代碼,便可以讓外部容器傳入對應的對象。該方案相當於定義了public 的set方法,但是因為沒有真正的set方法,從而不會為了實現依賴注入導致暴露了不該暴露的接口(因為set方法只想讓容器訪問來注入而不希望其他依賴此類的對象訪問)。
Spring注入:
Spring注入是指在啟動Spring容器加載bean配置的時候,完成對變量的賦值行為。即在IOC容器加載配置文件的過程中,會掃描相關配置,並為這些bean實例化,也就是創建對象,注入就是隨着創建的過程,完成對成員變量的賦值,例如在A類中聲明了一個B類,注入就是指IOC容器在初始化A的時候就把A的成員變量B進行賦值。
常用的兩種注入方式:
(1)設值注入
通過成員變量的set方法進行注入,xml配置文件中的配置:
這里也就是injectionDAO是injectionService中的一個屬性,而且injectionService中必須有injectionDAO的set方法,因為context容器會自動調用對其進行賦值
(2)構造注入
xml配置文件如下:
構造方法如下:
與設值注入其他配置類似,只是這里要求injectionService中,一定要有構造方法,且構造方法的參數名要是injectionDAO,在IOC容器調用InjectionServiceImpl的構造方法去創建這個類的實例的同時,就會把InjectionDAOImpl的實例賦值給injectionService中聲明的構造方法中的參數injectionDAO。