Spring中自動注入的兩種方式總結(jié)
1. 前言
Spring的核心技術(shù)IOC(Intorol of Converse控制反轉(zhuǎn))的實現(xiàn)途徑是DI(dependency Insert依賴注入)。而依賴注入(DI)的實現(xiàn)方式又有兩種,xml方式和注解方式。如下圖所示:
2. set注入和構(gòu)造注入
set注入和構(gòu)造注入,這兩種方法,是我們在第一次接觸Spring的時候,最先學(xué)習(xí)使用Spring容器創(chuàng)建對象并賦值的方式。具體的代碼及詳細(xì)解釋我已經(jīng)寫在了我前一篇的文章里,這里的鏈接:點進(jìn)去就能看到很仔細(xì)的set注入和構(gòu)造注入的詳細(xì)介紹和使用方法。
3. 什么情況下要使用自動注入
在我們學(xué)習(xí)完set注入和構(gòu)造注入之后,我們可能會發(fā)現(xiàn),要是某個類的引用屬性,也是其他類的屬性的時候,若我們使用大量的使用<propterty name="" ref="">去給其他類的這個引用屬性賦值,就會顯得十分的冗余。如下所示:
<beans> <bean id="a" class=""> <property name="" value=""/> <property name="11" ref="22"/> <!-某個引用類型的屬性是很多其他類的屬性--> </bean> <bean id="b" class=""> <property name="" value=""/> <property name="11" ref="22"/> <!-某個引用類型的屬性是很多其他類的屬性--> </bean> <bean id="c" class=""> <property name="" value=""/> <property name="11" ref="22"/><!-某個引用類型的屬性是很多其他類的屬性--> </bean> <bean id="d" class=""> <property name="" value=""/> <property name="11" ref="22"/><!-某個引用類型的屬性是很多其他類的屬性--> </bean> </beans>
上面的寫法就很冗余,那么有簡單的寫法嗎?當(dāng)然有,這種簡便的方法就是自動注入。
4. 自動注入之byName
下面緊挨著的代碼就是自動注入中的byName方式。
byName自動注入的特點就是,在<bean>標(biāo)簽中多寫上了一個屬性,type="byName"。
<bean id="" class="" type="byName"> <property name="" value=""/> <!--給基本類型屬性賦值,不能使用byName自動注入--> <property name="" ref=""/> <!--引用類型屬性賦值,可以使用byName自動注入,進(jìn)而實現(xiàn)簡寫--> </bean>
byName自動注入的使用要求:
必須依賴set()方法,也就是說只支持對set注入方式的簡寫。
<bean> <property name="" value=""/> <property name="" ref=""/> </bean>
不支持構(gòu)造注入。
<bean> <constructor-arg name="" value=""/> </bean>
且只支持為引用類型屬性賦值的時候使用byName的方式實現(xiàn)給引用類型屬性賦值;給簡單類型的屬性賦值,不能使用byName這種構(gòu)造注入,需要正常寫。
那么在給引用類型的屬性賦值的時候,使用了byName自動注入,那么我們便可以不寫<property name="" ref="">。那byName是如何實現(xiàn)給給引用類型屬性賦值的呢?
答案是:當(dāng)Spring發(fā)現(xiàn)你使用了byName這種自動注入的時候,它會自動去尋找當(dāng)前<bean>標(biāo)簽的class類,并去查看該類的引用屬性有哪些,然后去當(dāng)前xml文件中,去比對尋找是否有其他的<bean>標(biāo)簽的id等于該類的引用屬性名,和其他<bean>標(biāo)簽的class屬性值是否跟當(dāng)前要賦值的引用屬性的類是否一致。若是id和class都匹配上了,那么就會為該引用類型屬性賦值。
5. 自動注入之byType注入
下面緊挨著的代碼就是自動注入中的byType方式。
byType自動注入的特點就是,在<bean>標(biāo)簽中多寫上了一個屬性,type="byType"。byType自動注入的方式,跟byName的使用方法和要求幾乎一模一樣,只是在匹配賦值的時候,略有差別。
<bean id="" class="" type="byType"> <property name="" value=""/> <!--給基本類型屬性賦值,不能使用byType自動注入,需要正常寫--> <property name="" ref=""/> <!--引用類型屬性賦值,可以使用byType自動注入,進(jìn)而實現(xiàn)簡寫--> </bean> <!---->
byType自動注入的使用要求:
必須依賴set方法,因此必須是對set注入方法的簡寫
支持set注入:如下所示
<bean> <property name="" value=""/> <property name="" ref=""/> </bean>
不支持構(gòu)造注入:如下所示
<bean> <constructor-arg name="" value=""/> </bean>
只支持給set注入中的引用類型屬性賦值時候簡寫,不支持給set注入中的簡單類型賦值,(給set注入中的簡單類型賦值,仍需要正常寫)如下所示
<bean id="" class=""> <property name="" value=""/> <!--給基本類型屬性賦值,不能使用byType自動注入,需要正常寫--> <property name="" ref=""/> <!--引用類型屬性賦值,可以使用byType自動注入,進(jìn)而實現(xiàn)簡寫--> </bean>
那么但給引用類型的屬性賦值的時候,使用了byType自動注入,那么我們便可以不寫<property name="" ref="">。那byType是如何實現(xiàn)給給引用類型屬性賦值的呢?
答案是:Spring在見到byType自動注入的時候,會自動匹配其他的<bean>標(biāo)簽的class是否跟當(dāng)前要創(chuàng)建的對象的引用類型屬性是否是,子類,或者是接口實現(xiàn)類。若是則就會自動將匹配上的引用類型的值賦值給當(dāng)前創(chuàng)建對象的引用類型屬性。
??!注意!?。?/p>
由于Spring是單例模式,所以在使用自動注入給引用類型的屬性匹配的<bean>標(biāo)簽的時候,若是匹配上了兩個<bean>標(biāo)簽就會報錯。
到此這篇關(guān)于Spring中自動注入的兩種方式總結(jié)的文章就介紹到這了,更多相關(guān)Spring自動注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot多數(shù)據(jù)源的兩種實現(xiàn)方式實例
最近在項目開發(fā)中,需要為一個使用MySQL數(shù)據(jù)庫的SpringBoot項目,新添加一個PLSQL數(shù)據(jù)庫數(shù)據(jù)源,下面這篇文章主要給大家介紹了關(guān)于SpringBoot多數(shù)據(jù)源的兩種實現(xiàn)方式,需要的朋友可以參考下2022-04-04Spring容器刷新obtainFreshBeanFactory示例詳解
這篇文章主要為大家介紹了Spring容器刷新obtainFreshBeanFactory示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03MyBatis開發(fā)Dao層的兩種方式實現(xiàn)(原始Dao層開發(fā))
這篇文章主要介紹了MyBatis開發(fā)Dao層的兩種方式實現(xiàn)(原始Dao層開發(fā)),并對數(shù)據(jù)庫進(jìn)行增刪查改,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12Java使用數(shù)組實現(xiàn)ArrayList的動態(tài)擴(kuò)容的方法
這篇文章主要介紹了Java使用數(shù)組實現(xiàn)ArrayList的動態(tài)擴(kuò)容的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Java實戰(zhàn)之兼職平臺系統(tǒng)的實現(xiàn)
這篇文章主要介紹了如何利用Java編寫一個兼職平臺系統(tǒng),采用到的技術(shù)有Springboot、SpringMVC、MyBatis、ThymeLeaf等,感興趣的小伙伴可以了解一下2022-03-03