這篇文章主要介紹Spring中@Autowired注入有什么用,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)專(zhuān)注于企業(yè)成都全網(wǎng)營(yíng)銷(xiāo)、網(wǎng)站重做改版、柴桑網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5響應(yīng)式網(wǎng)站、成都做商城網(wǎng)站、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為柴桑等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
一、同一類(lèi)型注入多次為同一實(shí)例
首先讓我們先看下這段代碼是什么?
@Autowired private XiaoMing xiaoming; @Autowired private XiaoMing wanger;
XiaoMing.java
package com.example.demo.beans.impl; import org.springframework.stereotype.Service; /** * * The class XiaoMing. * * Description:小明 * * @author: huangjiawei * @since: 2018年7月23日 * @version: $Revision$ $Date$ $LastChangedBy$ * */ @Service public class XiaoMing { public void printName() { System.err.println("小明"); } }
我們都知道 @Autowired
可以根據(jù)類(lèi)型( Type
)進(jìn)行自動(dòng)注入,并且默認(rèn)注入的bean為單例( SingleTon
)的,那么我們可能會(huì)問(wèn),上面注入兩次不會(huì)重復(fù)嗎?答案是肯定的。而且每次注入的實(shí)例都是同一個(gè)實(shí)例。下面我們簡(jiǎn)單驗(yàn)證下:
@RestController public class MyController { @Autowired private XiaoMing xiaoming; @Autowired private XiaoMing wanger; @RequestMapping(value = "/test.json", method = RequestMethod.GET) public String test() { System.err.println(xiaoming); System.err.println(wanger); return "hello"; } }
調(diào)用上面的接口之后,將輸出下面內(nèi)容,可以看出兩者為同一實(shí)例。
com.example.demo.beans.impl.XiaoMing@6afd4ce9
com.example.demo.beans.impl.XiaoMing@6afd4ce9
二、注入接口類(lèi)型實(shí)例
如果我們要注入的類(lèi)型聲明為一個(gè)接口類(lèi)型,而且該接口有1個(gè)以上的實(shí)現(xiàn)類(lèi),那么下面這段代碼還能夠正常運(yùn)行嗎?我們假設(shè) Student
為接口, WangEr
和 XiaoMing
為兩個(gè)實(shí)現(xiàn)類(lèi)。
@Autowired private Student stu1; @Autowired private Student stu2;
@Service public class XiaoMing implements Student {
@Service public class WangEr implements Student {
答案是上面的代碼不能正常運(yùn)行,而且Spring 還啟動(dòng)報(bào)錯(cuò)了,原因是Spring想為 Student 注入一個(gè)單例的實(shí)例,但在注入的過(guò)程中意外地發(fā)現(xiàn)兩個(gè),所以報(bào)錯(cuò),具體錯(cuò)誤信息如下:
Field stu1 in com.example.demo.controller.MyController required a single bean, but 2 were found:
- wangEr: defined in file [C:\Users\huangjiawei\Desktop\demo\target\classes\com\example\demo\beans\impl\WangEr.class]
- xiaoMing: defined in file [C:\Users\huangjiawei\Desktop\demo\target\classes\com\example\demo\beans\impl\XiaoMing.class]
那該怎么弄才行呢?一般思路我們會(huì)想到為每個(gè)實(shí)現(xiàn)類(lèi)分配一個(gè)id值,結(jié)果就有了下面的代碼:
@Autowired private Student stu1; @Autowired private Student stu2;
@Service("stu1") public class XiaoMing implements Student {
@Service("stu2") public class WangEr implements Student {
做完上面的配置之后,Spring就會(huì)根據(jù)字段名稱(chēng)默認(rèn)去bean工廠找相應(yīng)的bean進(jìn)行注入,注意名稱(chēng)不能夠隨便取的,要和注入的屬性名一致。
三、總結(jié)
同一類(lèi)型可以使用@Autowired
注入多次,并且所有注入的實(shí)例都是同一個(gè)實(shí)例;
當(dāng)對(duì)接口進(jìn)行注入時(shí),應(yīng)該為每個(gè)實(shí)現(xiàn)類(lèi)指明相應(yīng)的id,則Spring將報(bào)錯(cuò);
以上是“Spring中@Autowired注入有什么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!