一、Spring簡介
1.Spring簡化Java開發
Spring Framework是一個應用框架,框架一般是半成品,我們在框架的基礎上可以不用每個項目自己實現架構、基礎設施和常用功能性組件,而是可以專注業務邏輯。因此學習Spring Framework在架構和模式方面的結構和原理,對我們在架構和模塊級別的理解幫助極大。Spring Framework(參考1)的宗旨是簡化Java開發,主要的手段如下:
(1)在架構上解耦:通過DI(依賴注入)管理類型依賴,通過AOP分離關注點,減少重複代碼。
(2)在設計上廣泛採用DIP(依賴倒置)和ISP(接口隔離)等原則和Facade(外觀)等模式:提供簡化的調用接口並封裝了眾多出色的第三方組件。
(3)在語言層面上採用註解:通過配置文件和Annotation(參考.NET Attribute)簡化應用配置。
2.Spring Framework的架構和模塊:
Spring Framework本身的架構是典型的鬆散分層,外層可以按需引用全部內層,內層不能引用外層。Spring的基礎組件如下圖所示:
從圖中可以看出,開始的模塊只有從core\beans\aop\context四個組件,後來添加了context-support【1.2】擴展模塊、expression【3.0】擴展模塊和beans-groovy【4.0】擴展模塊。
Spring上述模塊的基礎上,內建和封裝了眾多的實用的通用組件,主要的組件如圖所示:
從圖中可以看出,spring-oxm、spring-jdbc和spring-web是眾多模塊依賴的核心,spring-oxm提供了Object和XML的映射支持。
二、基礎知識
1.DIP:DIP(依賴倒置原則)是DI(依賴注入)的核心(參考2)。
(1)高層模塊不應該依賴於低層模塊。兩者都應該依賴於抽象。
(2)抽象不應該依賴於細節。細節應該依賴於抽象。
說人話就是:將對具體類的引用轉換成對其接口的引用,具體類只引用接口(引用==依賴,接口==接口或抽象類)。事實上我們調用具體類的時候在頭腦裡也是只關心其提供的API而非實現,DIP則通過在設計和重構階段在技術手段上保證了解耦。
2.DI:DI(依賴注入)讓我們不必手寫工廠代碼來管理接口和實現類的映射、對象的創建和生命周期的管理。
(1)接口注入:必須實現特定的接口才可以,侵入性太強,現在已經無人關心和使用。
(2)構造函數注入:依賴體現在構造函數的參數上。
(3)屬性注入:依賴體現在屬性上。
由於在實現時,可以將類型註冊為自己的兼容類型,這樣依賴注入就可以直接替代new實例化對象,這樣理解和使用依賴注入工具還不如不使用或手寫工廠了。依賴注入工具在實現時肯定會實現成一個支持不同配置和不同生命周期的對象工廠,但即使沒有提供一套添加依賴倒置原則限制的API,也不意味著我們把它當成new的替代品。如同映射工具雖然在實現時可以任意映射,但不是用來取代賦值的,而是用來處理領域實體和視圖模型等有實際對應關係的對象之間的映射。
(1)依賴配置:依賴配置是依賴注入實現的基礎。依賴注入工具都至少支持代碼配置和文件配置。Java中可以通過Annotation(.NET中通過Attribute)簡化配置。
(2)對象工廠:根據配置返回一個或多個對象。這是核心功能。
(3)生命周期管理:一般提供至少4種級別的支持:作用域、單例、線程、HTTP請求範圍。
大多數依賴注入工具在支持依賴倒置原則的基礎上,在技術手段上實現了更多的功能,如類型的兼容轉換、對依賴命名、在配置時直接傳入對象等。
三、Spring依賴注入的要點
Bean在Spring中就是POJO(.NET的POCO)。
Spring依賴注入需要掌握的核心是3個類型BeanDefinition、BeanFactory和ApplicationContext。
1.BeanFactory
BeanFactory是spring中依賴注入的核心接口,其設計主要採用了ISP(接口隔離原則),通過多層次的接口繼承即保證了單個接口的內聚又保證了整個體系的簡潔。這裡我們要關注的核心是DefaultListableBeanFactory。
如圖所示,查看XmlBeanFactory代碼,可以看到XmlBeanFactory只是通過XmlBeanDefinitionReader載入了BeanDefinition配置,XmlBeanDefinitionReader負責將配置解析到BeanDefinition。DefaultListableBeanFactory是真正的實現類,其中定義了類型為Map