@Autowired與@Resource在實(shí)現(xiàn)對(duì)象注入時(shí)的區(qū)別
簡(jiǎn)述
- @Autowired 是來(lái)?于 Spring的注解,? @Resource 來(lái)?于 JDK 的注解;
2.@Autowired 可?于 Setter 注?、構(gòu)造函數(shù)注?和屬性注?,? @Resource 只能?于 Setter 注 ?和屬性注?,不能?于構(gòu)造函數(shù)注?
3.使用時(shí)設(shè)置的參數(shù)不同: @Resource 比@Autowired 支持更多的參數(shù)設(shè)置,例如 name 設(shè)置,根據(jù)名稱獲取 Bean。下面詳細(xì)介紹
詳解
相同點(diǎn)1:屬性注入(Field Injection)
@Autowried
@Autowired//自動(dòng)裝配 private UserService userService;
@Resource
@Resource private UserService userService;
常見(jiàn)面試題:
注入屬性的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):使用簡(jiǎn)單方便
缺點(diǎn):
1.功能缺陷:不能注入一個(gè)不可變的對(duì)象(final對(duì)象)
為什么不能注入一個(gè)final修飾的變量呢?\color{green}{為什么不能注入一個(gè)final修飾的變量呢?}為什么不能注入一個(gè)final修飾的變量呢?
因?yàn)镾pring也要遵循Java的規(guī)范,final修飾的變量必須滿足1.使用時(shí)直接賦值,或者:2.構(gòu)造方法賦值
2.通用性問(wèn)題:只適用于IOC框架(容器)
3設(shè)計(jì)原則問(wèn)題,因?yàn)閷傩宰⑷牒?jiǎn)單方便,所以開(kāi)發(fā)者很容易就違背了單一設(shè)計(jì)原則。
相同點(diǎn)2:setter注入
//2. setter 注入(Setter Injection)
private UserService userService;
@Autowired
public void setUserService(UserService userService){
this.userService = userService;
}//使用Resource實(shí)現(xiàn)setter注入
private UserService userService;
@Resource
public void setUserService(UserService userService){
this.userService = userService;
}setter注入的優(yōu)點(diǎn):符合單一設(shè)計(jì)原則(一個(gè)setter只針對(duì)一個(gè)對(duì)象)
缺點(diǎn):
- 和屬性注入一樣,不能注入一個(gè)不可變的對(duì)象(final對(duì)象)
- 因?yàn)閟etter可以被調(diào)用多次,注入對(duì)象可以被修改,存在被篡改的可能
不同點(diǎn)1:@Autowried可以使用構(gòu)造方法注入,而@Resource不支持構(gòu)造方法注入
@Autowried
//3. 構(gòu)造方法注入(constructor Injection)
private UserService userService;
//當(dāng)當(dāng)前類里面只有一個(gè)構(gòu)造方法的時(shí)候,@Autowired 可以省略,當(dāng)存在多個(gè)構(gòu)造方法時(shí)Autowired不能省略
//可以在一個(gè)構(gòu)造方法中注入多個(gè)對(duì)象,@Autowired也是可以省略的
private UserComponent userComponent;
@Autowired
public UserController(UserService userService, UserComponent userComponent){
this.userService=userService;
this.userComponent = userComponent;
}注意:
1.setter注入和構(gòu)造方法注入@Autowried是添加在方法上面的
2.當(dāng)當(dāng)前類里面只有一個(gè)構(gòu)造方法的時(shí)候,@Autowired 可以省略,當(dāng)存在多個(gè)構(gòu)造方法時(shí),@Autowired不能省略
3.可以在一個(gè)構(gòu)造方法中注入多個(gè)對(duì)象,如果當(dāng)前類里面只有一個(gè)構(gòu)造方法的時(shí)候,@Autowired也是可以省略的
4.在Spring中,一個(gè)類中可以有多個(gè)構(gòu)造方法,但是只能有一個(gè)構(gòu)造方法前面加了@Autowried,否則報(bào)錯(cuò),加了@Autowried的構(gòu)造方法才會(huì)被執(zhí)行。
構(gòu)造方法注入優(yōu)點(diǎn):
能注入一個(gè)final修飾的屬性,因?yàn)樵跇?gòu)造方法中賦值了
因?yàn)闃?gòu)造方法在對(duì)象創(chuàng)建時(shí)就會(huì)執(zhí)行一次,因此他不存在對(duì)象會(huì)被隨時(shí)(調(diào)用)修改的情況,所以注入對(duì)象不會(huì)被修改
因?yàn)闃?gòu)造方法是在類創(chuàng)建之初就會(huì)執(zhí)行的方法,依賴是在類的構(gòu)造方法中的,所以依賴在對(duì)象使用前就會(huì)被完全初始化。
通用性更好,因?yàn)闃?gòu)造方法是Java(JDK)支持的(最底層的框架)
@Resource不支持構(gòu)造方法注入\color{red}{@Resource不支持構(gòu)造方法注入}@Resource不支持構(gòu)造方法注入
不同點(diǎn)2:
出身不同,@Autowried是來(lái)自Spring的注解,@Resource是來(lái)自jdk的注解
不同點(diǎn)3:@Resource支持的參數(shù)比@Autowried
@Resource支持的參數(shù)

@Autowried支持的參數(shù)

舉參數(shù)name的例子來(lái)說(shuō)明 當(dāng)Spring中有多個(gè)@Bean注解,叫User的對(duì)象,

如果直接用
@Autowired//自動(dòng)裝配 private User user;
則會(huì)報(bào)錯(cuò)

Spring為了解決這個(gè)問(wèn)題推出了以下方法:
@Autowired @Qualifier(value = "UserBeans_user1") private User user;
而使用@Resource,可以直接地區(qū)Spring中稱為UserBeans_user1的對(duì)象,復(fù)制到當(dāng)前類的user上
@Resource(name = "UserBeans_user1") private User user;
以上就是@Autowired與@Resource在實(shí)現(xiàn)對(duì)象注入時(shí)的區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于@Autowired與@Resource區(qū)別的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java大數(shù)據(jù)處理的核心技術(shù)MapReduce框架
MapReduce是一種分布式計(jì)算框架,適用于大規(guī)模的數(shù)據(jù)處理。它將大數(shù)據(jù)分成多個(gè)小數(shù)據(jù)塊,通過(guò)Map和Reduce兩個(gè)階段對(duì)數(shù)據(jù)進(jìn)行處理和分析。MapReduce框架具有可靠、高效、可擴(kuò)展等特點(diǎn),已經(jīng)成為大數(shù)據(jù)處理的核心技術(shù)2023-05-05
Mybatis報(bào)錯(cuò)mapkey is required問(wèn)題及解決
這篇文章主要介紹了Mybatis報(bào)錯(cuò)mapkey is required問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
Spring?component-scan?XML配置與@ComponentScan注解配置
這篇文章主要介紹了Spring?component-scan?XML配置與@ComponentScan注解配置,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之前綴,中綴和后綴表達(dá)式
這篇文章主要為大家介紹了Java的前綴,中綴和后綴表達(dá)式 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-01-01
java實(shí)現(xiàn)同態(tài)加密算法的實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)同態(tài)加密算法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Java如何通過(guò)File類方法刪除指定文件夾中的全部文件
這篇文章主要給大家介紹了關(guān)于Java如何通過(guò)File類方法刪除指定文件夾中的全部文件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
idea debug沒(méi)有force step into的問(wèn)題解決
本文主要介紹了IDEA Debug中ForceStepInto按鈕消失的問(wèn)題及解決方法,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10

