深入了解Spring中的@Autowired和@Resource注解
@Resource和@Autowired是Spring Framework中兩種常用的注入方式,它們的作用是在Spring容器中自動(dòng)裝配Bean對(duì)象.
@Autowired
@Autowired是Spring Framework提供的注解,它也可以實(shí)現(xiàn)自動(dòng)裝配Bean對(duì)象.
@RestController
public class DemoController {
/**
* 下面兩種@Autowired使用一種即可
*/
@Autowired
DemoService demoService;
@Autowired
public void setDemoService(DemoService demoService) {
this.demoService = demoService;
}
}
@Autowired注解按照類(lèi)型(byType)裝配依賴(lài)對(duì)象,默認(rèn)情況下它要求依賴(lài)對(duì)象必須存在,如果允許null值,可以設(shè)置它的required屬性為false.如果我們想使用按照名稱(chēng)(byName)來(lái)裝配,可以結(jié)合@Qualififier注解一起使用.如下:
@RestController
public class DemoController {
@Autowired
@Qualifier(value = "demoService")
DemoService demoService;
}
如果存在多個(gè)同類(lèi)型的Bean對(duì)象,可以使用@Primary來(lái)指定一個(gè)默認(rèn)的Bean對(duì)象,如下:
@RestController
public class DemoController {
@Autowired
DemoService demoService;
}
public interface DemoService {}
@Service
@Primary
public class DemoServiceImpl implements DemoService {}
@Service
public class DemoServiceImpl1 implements DemoService {}
@Resource
@Resource默認(rèn)按照byName自動(dòng)注入,由JavaEE5提供.@Resource有兩個(gè)重要的屬性:name和type,而Spring將@Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類(lèi)型,所以,如果要使用name屬性,則使用byName的自動(dòng)注入策略,而使用type屬性時(shí)則使用byType自動(dòng)注入策略.如果即不指定name也不指定type,這時(shí)將通過(guò)反射機(jī)制使用byName自動(dòng)注入策略.
@RestController
public class DemoController {
/**
* 下面兩種@Resource使用一種即可
*/
@Resource
DemoService demoService;
@Resource
public void setDemoService(DemoService demoService) {
this.demoService = demoService;
}
}
@Resource裝配順序:
- 如果同時(shí)指定了name和type,則從Spring上下文中找到唯一匹配的bean進(jìn)行裝配,找不到則拋異常
- 如果指定了name,則從上下文中查找名稱(chēng)匹配的bean進(jìn)行裝配,找不到則拋異常
- 如果指定了type,則從上下文中找到類(lèi)型匹配的唯一bean進(jìn)行裝配,找不到或找到多個(gè),都會(huì)拋異常
- 如果即沒(méi)有指定type,也沒(méi)指定name,則自動(dòng)按照byName方式進(jìn)行裝配,如果匹配則自動(dòng)裝配.如果沒(méi)有匹配,則回退為一個(gè)原始類(lèi)型進(jìn)行匹配.
總結(jié)
區(qū)別
- @Resource默認(rèn)按名稱(chēng)進(jìn)行匹配,@Autowired默認(rèn)按照類(lèi)型進(jìn)行匹配,但可以通過(guò)@Qualifier注解指定名稱(chēng)進(jìn)行匹配
- @Resource可以用在字段,setter方法和構(gòu)造函數(shù)上,@Autowired可以用在字段,setter方法,構(gòu)造函數(shù)和方法上
- @Resource不支持@Primary注解,@Autowired支持
- @Resource是JavaEE5提供的注解,而@Autowired是Spring Framework提供的注解
應(yīng)用場(chǎng)景
根據(jù)以上區(qū)別,我們可以根據(jù)具體情況選擇使用@Resource或@Autowired.如果希望按照名稱(chēng)進(jìn)行匹配,并且不需要支持@Primary注解,可以選擇@Resource;如果希望按照類(lèi)型進(jìn)行匹配,并且需要支持@Primary注解,可以選擇@Autowried.根據(jù)具體情況選擇合適的注解來(lái)實(shí)現(xiàn)自動(dòng)裝配
到此這篇關(guān)于深入了解Spring中的@Autowired和@Resource注解的文章就介紹到這了,更多相關(guān)Spring @Autowired和@Resource內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring中@Autowired @Resource @Inject三個(gè)注解有什么區(qū)別
- 淺談Spring框架中@Autowired和@Resource的區(qū)別
- 一文搞懂Spring中@Autowired和@Resource的區(qū)別
- Spring@Autowired與@Resource的區(qū)別有哪些
- Spring中@Autowired與@Resource的區(qū)別詳析
- Spring注解@Resource和@Autowired區(qū)別對(duì)比詳解
- 詳解Spring注解--@Autowired、@Resource和@Service
- Spring框架中 @Autowired 和 @Resource 注解的區(qū)別
相關(guān)文章
NoHttpResponseException問(wèn)題排查解決記錄分析
這篇文章主要為大家介紹了NoHttpResponseException問(wèn)題排查解決記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Java開(kāi)發(fā)學(xué)習(xí)之Bean的生命周期詳解
從創(chuàng)建到消亡的完整過(guò)程,例如人從出生到死亡的整個(gè)過(guò)程就是一個(gè)生命周期。本文將通過(guò)示例為大家詳細(xì)講講Bean的生命周期,感興趣的可以學(xué)習(xí)一下2022-06-06
Java設(shè)計(jì)模塊系列之書(shū)店管理系統(tǒng)單機(jī)版(一)
這篇文章主要為大家詳細(xì)介紹了Java單機(jī)版的書(shū)店管理系統(tǒng)設(shè)計(jì)模塊和思想第一章,感興趣的小伙伴們可以參考一下2016-08-08
基于ScheduledExecutorService的兩種方法(詳解)
下面小編就為大家?guī)?lái)一篇基于ScheduledExecutorService的兩種方法(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
SpringBoot動(dòng)態(tài)修改日志級(jí)別的操作
這篇文章主要介紹了SpringBoot動(dòng)態(tài)修改日志級(jí)別的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07

