Spring的核心機制:依賴注入(DI)
1 理解依賴注入
A物件需要呼叫B物件方法的情形,被Spring稱為依賴,即A物件依賴於B物件;
互相呼叫的關係稱為依賴關係;
Spring容器是一個大工廠,管理著所有java物件,這些物件被稱為Bean;
Spring容器通過一種“依賴注入”的方式來管理Bean之間的依賴關係;
使用依賴注入,可謂Bean注入普通的屬性值,注入其它的Bean引用;
依賴注入是一種優秀的解耦方式,讓Spring的Bean以配置檔案的方式組織在一起,而不是硬編碼的方式組織在一起;
IOC--控制反轉和DI--依賴注入,其含義完全相同,只是描述的角度不同;
IOC--控制反轉-: 呼叫者獲取被依賴的物件,由原來的主動便成為被動接受;
DI--依賴注入:Spring直接將被依賴的物件注入給呼叫者,無需呼叫者主動去獲取;
2 屬性注入(設定注入)
屬性注入即通過 setter 方法注入Bean 的屬性值或依賴的物件
屬性注入使用 <property> 元素, 使用 name 屬性指定 Bean 的屬性名稱,value 屬性或 <value> 子節點指定屬性值
屬性注入是實際應用中最常用的注入方式
<Bean id="student" class="com.bugshi.Studeng"> <property name="stuName" value="bugshi"></property> <property name="age" value="13"></property>
<property name="school" ref="school"></property>
</bean>
<bean/> :代表一個Bean物件,id:唯一標識,class:對應的類,Spring通過該類使用反射得到類的資訊完成資訊的設定;
<property> :代表一個Bean物件的屬性,name:屬性的setter方法的首字母小寫,value : 設定的屬性值,ref:指向某個Bean的引用id;
3 構造注入
通過構造方法注入Bean 的屬性值或依賴的物件,它保證了 Bean 例項在例項化後就可以使用;
構造器注入在 <constructor-arg> 元素裡宣告屬性, <constructor-arg> 中沒有 name 屬性;
按索引匹配入參:以下標去匹配引數
<Bean id="student" class="com.bugshi.Studeng"> <constructor value="bugshi" index="0"></constructor> <constructor value="13" index="1"></constructor>
<constructor ref="school"></constructor>
</bean>
按型別匹配入參:以型別去匹配引數
<Bean id="student" class="com.bugshi.Studeng"> <constructor value="bugshi" type="java.lang.String"></constructor> <constructor value="13" index="1" type="int"></constructor>
<constructor ref="school"></constructor>
</bean>
ref屬性:指向某個Bean引用的Id;
兩種注入方式沒有絕對的好壞,只有應用場景的不通;
建議採用屬性注入為主,構造注入為輔的注入策略;