@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ù)名稱(chēng)獲取 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修飾的變量必須滿(mǎn)足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)前類(lèi)里面只有一個(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)前類(lèi)里面只有一個(gè)構(gòu)造方法的時(shí)候,@Autowired 可以省略,當(dāng)存在多個(gè)構(gòu)造方法時(shí),@Autowired不能省略
3.可以在一個(gè)構(gòu)造方法中注入多個(gè)對(duì)象,如果當(dāng)前類(lèi)里面只有一個(gè)構(gòu)造方法的時(shí)候,@Autowired也是可以省略的
4.在Spring中,一個(gè)類(lèi)中可以有多個(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)造方法是在類(lèi)創(chuàng)建之初就會(huì)執(zhí)行的方法,依賴(lài)是在類(lèi)的構(gòu)造方法中的,所以依賴(lài)在對(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中稱(chēng)為UserBeans_user1的對(duì)象,復(fù)制到當(dāng)前類(lèi)的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)文章
idea創(chuàng)建maven父子工程導(dǎo)致子工程無(wú)法導(dǎo)入父工程依賴(lài)
創(chuàng)建maven父子工程時(shí)遇到一個(gè)問(wèn)題,本文主要介紹了idea創(chuàng)建maven父子工程導(dǎo)致子工程無(wú)法導(dǎo)入父工程依賴(lài),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04SpringBoot自動(dòng)重啟、熱啟動(dòng)方式
這篇文章主要介紹了SpringBoot自動(dòng)重啟、熱啟動(dòng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03深入了解Maven Settings.xml文件的結(jié)構(gòu)和功能
這篇文章主要為大家介紹了Maven Settings.xml文件基本結(jié)構(gòu)和功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11Java.SE數(shù)組的一些常見(jiàn)練習(xí)題
數(shù)組可以看成是相同類(lèi)型元素的一個(gè)集合,在內(nèi)存中是一段連續(xù)的空間,這篇文章主要給大家介紹了關(guān)于Java.SE數(shù)組的一些常見(jiàn)練習(xí)題,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02SpringBoot集成thymeleaf渲染html模板的步驟詳解
這篇文章主要給大家詳細(xì)介紹了SpringBoot集成thymeleaf如何使實(shí)現(xiàn)html模板的渲染,文中有詳細(xì)的代碼示例,具有一定的參考價(jià)值,需要的朋友可以參考下2023-06-06Ajax實(shí)現(xiàn)搜索引擎自動(dòng)補(bǔ)全功能
本文主要介紹了Ajax實(shí)現(xiàn)搜索引擎自動(dòng)補(bǔ)全功能的實(shí)例解析。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04springboot?jpa?實(shí)現(xiàn)返回結(jié)果自定義查詢(xún)
這篇文章主要介紹了springboot?jpa?實(shí)現(xiàn)返回結(jié)果自定義查詢(xún)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02EasyUi+Spring Data 實(shí)現(xiàn)按條件分頁(yè)查詢(xún)的實(shí)例代碼
這篇文章主要介紹了EasyUi+Spring Data 實(shí)現(xiàn)按條件分頁(yè)查詢(xún)的實(shí)例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-07-07