Spring IOC總結
控制反轉,是一種設計思想,意味著將設計好的對象交給Ioc容器控制,而不是傳統的在對象的內部直接控制。
IOC容器把創建和查找依賴對象的控制權交給了容器,由容器進行註入組合對象。
DI
依賴註入,組件之間的依賴關系由容器在運行期間決定。
Ioc容器註入應用程序某個對象,它所需要的外部資源(包括對象,資源,常量數據)。
Spring Ioc容器
具有依賴註入功能的容器。負責實例化,定位,配置應用程序中的對象及建立這些對象間的依賴。
在Spring中BeanFactory是Ioc容器的實際代表者。BeanFactory接口提供了IoC容器的基本功能。
Spring Ioc容器通過讀取配置文件中的配置元數據,通過元數據對應用中各個對象進行實例化及裝配。
1 xml配置文件進行配置元數據(一般使用)
2 基於註解
3 基於java文件
Spring Ioc容器管理的對象:Bean
Bean就是由Spring容器初始化、裝配及管理的對象,此外bean與應用程序中的其他對象沒有什麽區別.
Bean在容器內部由BeanDefinition對象表示。
BeanDefinition:
全限定類名(FQN):用於定義Bean的實現類;(必須的)
Bean行為定義:包括作用域(單例、原型創建)、是否惰性初始化及生命周期等;
Bean創建方式定義:說明是通過構造器還是工廠方法創建Bean;
Bean之間關系定義:即對其他bean的引用,也就是依賴關系定義,也就是依賴註入。
Bean的作用域:
1. “singleton”(單例,通過單例緩存池實現)
2. “prototype”(原型,每次創建全新的bean)
3. 另外提供“request”、“session”、“global session”三種web作用域;
Spring Ioc容器工作流程:(基於xml配置)
1. 準備配置文件
2. 由Ioc容器進行解析元數據,創建,組裝bean
3. 客戶端實例化Ioc容器,從容器中獲取需要的bean
Spring IoC容器實例化Bean
根據Bean定義裏的配置元數據使用反射機制來創建Bean。
1. 使用無參構造器
2. 靜態工廠
3. 實例工廠
Spring IoC容器註入依賴資源的方式:
1. 構造器註入。
通過在<bean>中配置構造器實現,構造器參數就是依賴。
配置文件中三種表示參數的方式:參數索引,參數類型,參數名稱
public HelloImpl3(String message, int index) {
this.message = message;
this.index = index;
}
<!-- 通過構造器參數索引方式依賴註入 -->
<bean id="byIndex" class="cn.javass.spring.chapter3.HelloImpl3">
<constructor-arg index="0" value="Hello World!"/>
<constructor-arg index="1" value="1"/>
</bean>
<!-- 通過構造器參數類型方式依賴註入 -->
<bean id="byType" class="cn.javass.spring.chapter3.HelloImpl3">
<constructor-arg type="java.lang.String" value="Hello World!"/>
<constructor-arg type="int" value="2"/>
</bean>
<!-- 通過構造器參數名稱方式依賴註入 -->
<bean id="byName" class="cn.javass.spring.chapter3.HelloImpl3">
<constructor-arg name="message" value="Hello World!"/>
<constructor-arg name="index" value="3"/>
</bean>
2. Setter註入
通過在通過構造器,靜態工廠,實例工廠實例好bean後,通過調用bean類的setter方法進行註入依賴。
只有一種方式,根據名字註入。
//setter方法
public void setMessage(String message) {
this.message = message;
}
public void setIndex(int index) {
this.index = index;
}
<bean id="bean" class="cn.javass.spring.chapter3.HelloImpl4">
<property name="message" value="Hello World!"/>
<property name="index"><value>1</value></property>
</bean>
Spring IoC容器註入集合、數組、字典
Spring不僅能註入簡單類型數據,還能註入集合(Collection、Set、List)類型、數組(Array)類型、字典(Map)類型數據、Properties類型數據。
自動裝配
自動裝配就是指由Spring來自動地註入依賴對象,無需人工參與。
自動裝配的好處是減少構造器註入和setter註入配置,減少配置文件的長度。自動裝配通過配置<bean>標簽的 “autowire”屬性來改變自動裝配方式。
Eg.<bean id="bean" class="cn.javass.spring.chapter3.bean.HelloApiDecorator"
autowire="byName"/>
四種可選值:“no”、“byName ”、“byType”、“constructor”
如果一個bean有很多setter註入,通過“byName”方式能減少很多<property>配置。
Spring IOC總結