十年架構師詳解,Spring-IoC容器裝配Bean
先看一下Spring容器內部是如何協助的,也就是Spring容器、Bean的配置資訊、Bean的實現類及應用程式之間的關係,如下圖
由上圖我們看到,一個Bean從建立到被程式使用經歷了四個階段。本文主要講解Bean在Spring中的裝配。裝配方式主要分為如下幾種。
1. 基於XML的配置
1.1 依賴注入
依賴注入分為幾種方式:屬性注入、建構函式注入、工廠方法注入
屬性注入:
建構函式注入:
工廠方法注入:
1.2 方法注入(主要是lookup方法注入)
Spring IoC容器擁有複寫Bean方法的能力,這項魔術般的能力主要歸功於CGLib類包。CGLib可以在執行期動態操作Class位元組碼,為Bean動態建立子類或實現類。
1.3 Bean的作用域
注意劃重點:
1. 為什麼Spring把Bean的預設作用域定為singleton
Spring對單例模式進行了超越,在傳統開發中,由於DAO類持有Connection這個非執行緒安全的變數,因此往往未採用單例模式。而在Spring環境中,對於所有的DAO都採用單例模式,因為Spring利用AOP和LocalThread功能,對非執行緒安全的變數進行了特殊處理,使這些非執行緒安全的類變成了執行緒安全的類。因為Spring的這一超越,所以在實際應用中都能以單例項的方式執行,這也就是為什麼Spring把Bean的預設作用域定位singleton的原因。
架構社群:142019080
2. 基於註解的配置
除了@Component,Spring還提供了3個功能基本和@Component等效的註解,分別用於對DAO、Service、及Web層的Controller進行註解
@Repository:用於對DAO實現類進行標註
@Service:用於對Service實現類進行標註
@Controller:用於對Controller實現類進行標註
2.1 自動裝配Bean
2.1.1 使用@Autowired進行自動注入
2.1.2. 使用@Autowired的required屬性,預設情況下,required是true,找不到匹配的bean,則會報錯,使用required=false,則不會報錯
2.1.3. 使用@Qualifier指定注入Bean的名稱,假設容器中有兩個型別為UserDao的Bean,一個名字為userDao,另一個名字為otherUserDao,則下面的程式碼則使用userDao的Bean.
2.1.4. 對類方法進行標註
2.1.5. 對集合類進行標註(劃重點)
對於一個Service有多個實現類,我們應該如何去注入,並且使用,用集合類進行標註就可以。
2.1.6. 對延遲依賴注入的支援
注意:使用@Lazy需要同時標註在屬性及目標Bean上,二者缺一不可
架構社群:142019080
2.2 Bean的作用範圍及生命過程方法
雖然Bean在Spring中預設的載入方式是singleton,但是可以通過上面的方式修改。
配置Bean的生命週期過程註解
啟動容器與銷燬容器:
我們看下列印是什麼
3. 基於Java類的配置
啟動:
4. 基於Groovy DSL的配置(不做過多敘述)
5. 通過編碼方式動態的新增Bean(不做過多敘述)
6. 不同配置方式的比較
7. Bean不同配置方式的使用場景
加架構社群:142019080領取資料,裡面會分享一些資深架構師錄製的視訊錄影:有Spring,MyBatis,Netty原始碼分析,高併發、高效能、分散式、微服務架構的原理,JVM效能優化這些成為架