關(guān)于@Autowierd && @Resource 你真的了解嗎
關(guān)于@Autowierd && @Resource 你真的了解嗎
1.@Autowierd
使用byType注入,默認(rèn)情況下要求依賴必須存在;配置required=false表示依賴可為null
下面代碼第一個(gè)注入是會(huì)報(bào)錯(cuò)的,編輯器是會(huì)有紅色提示。
因?yàn)榇a中沒有這樣的bean,截圖也能看的出來。
@Autowired private Data data; //報(bào)錯(cuò) @Autowired(required = false) //沒事 private Data data2;
2.@Resource
按照ByName自動(dòng)注入,@Resource有兩個(gè)重要的屬性:name和type,而Spring將@Resource注解的 name屬性解析為bean的名字,而type屬性則解析為bean的類型。
所以,如果使用name屬性,則使用byName的自動(dòng)注入策略,而使用type屬性時(shí)則使用byType自動(dòng)注入策略。
如果既不制定name也不制定type屬性,這時(shí)將通過反射機(jī)制使用byName自動(dòng)注入策略。
2.1@Resource具體裝配順序,即指定的注入實(shí)例的策略
①如果同時(shí)指定了name和type,則從Spring上下文中找到唯一匹配的bean進(jìn)行裝配,找不到則拋出異常。
②如果指定了name,則從上下文中查找名稱(id)匹配的bean進(jìn)行裝配,找不到則拋出異常。
③如果指定了type,則從上下文中找到類似匹配的唯一bean進(jìn)行裝配,找不到或是找到多個(gè),都會(huì)拋出異常。
④如果既沒有指定name,又沒有指定type,則自動(dòng)按照byName方式進(jìn)行裝配;如果沒有匹配,則回退為一個(gè)原始類型進(jìn)行匹配,如果匹配則自動(dòng)裝配(即按照byType的方式)
3.注意
如果是接口或者抽象類的話那么需要實(shí)現(xiàn)類唯一,否則創(chuàng)建實(shí)例出錯(cuò),或者說當(dāng)接口或抽象類有n多個(gè)實(shí)現(xiàn)類(繼承類)時(shí),在注入的必須指定此時(shí)要注入的實(shí)現(xiàn)類(繼承類)。
找到兩個(gè)實(shí)現(xiàn)類,報(bào)錯(cuò)!?。?/strong>
3.1 @Autowierd解決
@Autowierd需要借助@Qualifier來幫助區(qū)分使用具體的哪個(gè)實(shí)現(xiàn)類
@Autowired @Qualifier("userServiceImpl") private UserService userService;
3.2 @Resource解決
@Resource 可以使用name屬性或者是type屬性來指定想要注入的實(shí)現(xiàn)類。
@Resource(name = "userServiceImpl2") private UserService userService1; @Resource(type = UserServiceImpl.class) private UserService userService3;
4.高級(jí)用法
@Autowierd 注入抽象類時(shí),當(dāng)抽象類有多個(gè)繼承類,可以使用
@Autowierd List<抽象類> ll;//來獲取所有的子類實(shí)現(xiàn)集合
@Autowired private List<UserService> userServices;
小結(jié):
- @Autowierd & @Resource 功能相當(dāng),都可以注入實(shí)例
- @Autowierd 通過byType的方式注入
- @Resource 優(yōu)先使用byName的方式注入,然后使用@Autowire的方式注入
這就是為什么mybatis自動(dòng)生成的Mapper文件,你使用@Resouce Idea不會(huì)提示紅色下劃線(其實(shí)在dao文件的已經(jīng)被掃描了,但是ieda在編輯的時(shí)候找不到,但是在運(yùn)行中是能夠找到的)
1.dao層配置
2.mybatis自動(dòng)生成Mapper文件
3具體情況:一看便知
看著報(bào)錯(cuò),其實(shí)不會(huì)有錯(cuò),以為在2中已配置包掃描了。
@Autowired private TCommentInfoMapper tCommentInfoMapper; @Resource private TCommentInfoMapper tCommentInfoMapper2;
@Autowire和@Resource注解對(duì)比
在我看來@Autowire和@Resource有兩個(gè)區(qū)別:
一、@Resource是J2EE提供的,@Autowire是Spring提供的
二、兩個(gè)注解使用name區(qū)別注入的寫法不同
三、然后就沒有什么不同了
網(wǎng)上很多人專門介紹@Resource能夠用變量名或set方法里的變量名作為對(duì)象name來使用,說的好像@Autowire就不能似的.
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解PowerDesigner之CDM、PDM、SQL之間轉(zhuǎn)換
這篇文章主要介紹了詳解PowerDesigner之CDM、PDM、SQL之間轉(zhuǎn)換的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10ElasticSearch學(xué)習(xí)之Es集群Api操作示例
這篇文章主要為大家介紹了ElasticSearch學(xué)習(xí)之Es集群Api操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Java Vector實(shí)現(xiàn)班級(jí)信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java Vector實(shí)現(xiàn)班級(jí)信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Mybatis Plus 代碼生成器的實(shí)現(xiàn)
這篇文章主要介紹了Mybatis Plus 代碼生成器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09