Spring中依賴注入(DI)幾種方式解讀
更新時間:2024年01月16日 09:45:12 作者:加油當(dāng)當(dāng)
這篇文章主要介紹了Spring中依賴注入(DI)幾種方式解讀,構(gòu)造器依賴注入通過容器觸發(fā)一個類的構(gòu)造器來實(shí)現(xiàn)的,該類有一系列參數(shù),每個參數(shù)代表一個對其他類的依賴,需要的朋友可以參考下
Spring依賴注入(DI)
構(gòu)造器注入
- 構(gòu)造器依賴注入通過容器觸發(fā)一個類的構(gòu)造器來實(shí)現(xiàn)的,該類有一系列參數(shù),每個參數(shù)代表一個對其他類的依賴?!疽话悴挥谩?/li>
- 在構(gòu)造調(diào)用者實(shí)例的同時,在構(gòu)造方法中給屬性賦值,完成被調(diào)用者的實(shí)例化。即,使用構(gòu)造器設(shè)置依賴關(guān)系;
- 優(yōu)點(diǎn):對象初始化完成后便可獲得可使用的對象;
- 缺點(diǎn):當(dāng)需要注入的對象很多時,構(gòu)造器參數(shù)列表將會很長;不夠靈活。若有多種注入方式,每種方式只需注入指定幾個依賴,那么就需要提供多個重載的構(gòu)造函數(shù),麻煩;
- Spring容器會將每一個正在創(chuàng)建的 Bean 標(biāo)識符放在一個"當(dāng)前創(chuàng)建 Bean 池"中,Bean 標(biāo)識符在創(chuàng)建過程中將一直保持在這個池中,因此如果在創(chuàng)建 Bean 過程中發(fā)現(xiàn)自己已經(jīng)在"當(dāng)前創(chuàng)建 Bean 池"里時將拋出BeanCurrentlyInCreationException異常表示循環(huán)依賴;而對于創(chuàng)建完畢的 Bean 將從"當(dāng)前創(chuàng)建 Bean 池"中清除掉;
- <constructor-arg> 標(biāo)簽:一個<constructor-arg>表示構(gòu)造方法一個參數(shù);
- <constructor-arg> 標(biāo)簽屬性:
- name:表示構(gòu)造方法的形參名;
- index:表示構(gòu)造方法的參數(shù)的位置,參數(shù)從左往右位置是 0,1,2 的順序;
- value:構(gòu)造方法的形參類型是簡單類型的,使用value;
- ref:構(gòu)造方法的形參類型是引用類型的,使用ref;
- 代碼示例:
public Student(String myname,int myage,School myXueXiao){ System.out.print1n( "student的有參數(shù)構(gòu)造方法"); this.name = myname; this.age = myage; this.school= myXueXiao; }
<!--使用name屬性實(shí)現(xiàn)構(gòu)造注入--> <bean id="myStudent" class="com.bit.ba03.Student" > <constructor-arg name="myage" value="20" /> <constructor-arg name="mySchool" ref="myXueXiao" /> <constructor-arg name="myname" value="周良"/> </bean> <!--使用index屬性--> <bean id="myStudent2" class="com.bit.ba03.Student"> <constructor-arg index="1" value="22" /> <constructor-arg index="0" value="李四" /> <constructor-arg index="2" ref="myXueXiao" /> </bean> <!--省略index,順序不能亂寫了--> <bean id="myStudent3" class="com.bit.ba03.Student"> <constructor-arg value="張強(qiáng)強(qiáng)" /> <constructor-arg value="22" /> <constructor-arg ref="myXueXiao" /> </bean>
setter方法注入
- Setter方法注入是容器通過調(diào)用無參構(gòu)造器或無參static工廠方法實(shí)例化bean之后,調(diào)用該bean的setter方法,即實(shí)現(xiàn)了基于setter的依賴注入;
- IOC Service Provider 通過調(diào)用成員變量提供的setter函數(shù)將被依賴對象注入給依賴類;
- 優(yōu)點(diǎn):靈活??梢赃x擇性地注入需要的對象;
- 缺點(diǎn):依賴對象初始化完成后由于尚未注入被依賴對象,因此還不能使用;
簡單類型的set注入
- 簡單類型: spring中規(guī)定java的基本數(shù)據(jù)類型和String都是簡單類型;
- set屬性會調(diào)用屬性中的set方法進(jìn)行賦值,屬性是been中指定類中的屬性所以要求類中必須有set方法;
- 先執(zhí)行構(gòu)造方法創(chuàng)建對象,然后執(zhí)行set方法進(jìn)行賦值;
- 代碼:
public class Id { private int id; public int getId() { return id; } public void setId(int id) { this.id = id; } }
<bean id="xx" class="yyy.Id"> <property name="屬性名字" value="此屬性的值"/> 一個property只能給一個屬性賦值 <property....> </bean>
引用類型set注入
- 當(dāng)指定 bean 的某屬性值為另一 bean 的實(shí)例時,通過 ref 指定它們間的引用關(guān)系。ref 的值必須為某 bean 的 id 值;
- set屬性會調(diào)用屬性中的set方法進(jìn)行賦值,屬性是been中指定類中的屬性所以要求類中必須有set方法;
- 先執(zhí)行構(gòu)造方法創(chuàng)建對象,然后執(zhí)行set方法進(jìn)行賦值;
<bean id="xxx" class="yyy"> <property name="屬性名稱" ref="bean的id(對象的名稱)" /> </bean>
代碼:
public class student{ private string name;private int age; private school school; // setter // toString() }
<bean id="myStudent" class="com.bit.ba02.Student"> <!--引用類型的屬性賦值–-> <property name="school" ref="mySchool" />〈!-- setSchool(mySchool) --> </bean>
到此這篇關(guān)于Spring中依賴注入(DI)幾種方式解讀的文章就介紹到這了,更多相關(guān)Spring依賴注入(DI)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java并發(fā)編程之關(guān)鍵字volatile知識總結(jié)
今天帶大家學(xué)習(xí)java的相關(guān)知識,文章圍繞著Java關(guān)鍵字volatile展開,文中有非常詳細(xì)的知識總結(jié),需要的朋友可以參考下2021-06-06Jexcel實(shí)現(xiàn)按一定規(guī)則分割excel文件的方法
這篇文章主要介紹了Jexcel實(shí)現(xiàn)按一定規(guī)則分割excel文件的方法,涉及java操作Excel文件的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07intelliJ IDEA 多行選中相同內(nèi)容的快捷鍵分享
這篇文章主要介紹了intelliJ IDEA 多行選中相同內(nèi)容的快捷鍵分享,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02在Mac下IDEA安裝并使用protobuf方式(Java)
這篇文章主要介紹了在Mac下IDEA安裝并使用protobuf方式(Java),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11