關於@Autowierd && @Resource 你真的瞭解嗎
關於@Autowierd && @Resource 你真的瞭解嗎
1.@Autowierd
使用byType註入,默認情況下要求依賴必須存在;配置required=false表示依賴可為null
下面代碼第一個註入是會報錯的,編輯器是會有紅色提示。
因為代碼中沒有這樣的bean,截圖也能看的出來。
@Autowired private Data data; //報錯 @Autowired(required = false) //沒事 private Data data2;
2.@Resource
按照ByName自動註入,@Resource有兩個重要的屬性:name和type,而Spring將@Resource註解的 name屬性解析為bean的名字,而type屬性則解析為bean的類型。
所以,如果使用name屬性,則使用byName的自動註入策略,而使用type屬性時則使用byType自動註入策略。
如果既不制定name也不制定type屬性,這時將通過反射機制使用byName自動註入策略。
2.1@Resource具體裝配順序,即指定的註入實例的策略
①如果同時指定瞭name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常。
②如果指定瞭name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常。
③如果指定瞭type,則從上下文中找到類似匹配的唯一bean進行裝配,找不到或是找到多個,都會拋出異常。
④如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退為一個原始類型進行匹配,如果匹配則自動裝配(即按照byType的方式)
3.註意
如果是接口或者抽象類的話那麼需要實現類唯一,否則創建實例出錯,或者說當接口或抽象類有n多個實現類(繼承類)時,在註入的必須指定此時要註入的實現類(繼承類)。
找到兩個實現類,報錯!!!
3.1 @Autowierd解決
@Autowierd需要借助@Qualifier來幫助區分使用具體的哪個實現類
@Autowired @Qualifier("userServiceImpl") private UserService userService;
3.2 @Resource解決
@Resource 可以使用name屬性或者是type屬性來指定想要註入的實現類。
@Resource(name = "userServiceImpl2") private UserService userService1; @Resource(type = UserServiceImpl.class) private UserService userService3;
4.高級用法
@Autowierd 註入抽象類時,當抽象類有多個繼承類,可以使用
@Autowierd List<抽象類> ll;//來獲取所有的子類實現集合
@Autowired private List<UserService> userServices;
小結:
- @Autowierd & @Resource 功能相當,都可以註入實例
- @Autowierd 通過byType的方式註入
- @Resource 優先使用byName的方式註入,然後使用@Autowire的方式註入
這就是為什麼mybatis自動生成的Mapper文件,你使用@Resouce Idea不會提示紅色下劃線(其實在dao文件的已經被掃描瞭,但是ieda在編輯的時候找不到,但是在運行中是能夠找到的)
1.dao層配置
2.mybatis自動生成Mapper文件
3具體情況:一看便知
看著報錯,其實不會有錯,以為在2中已配置包掃描瞭。
@Autowired private TCommentInfoMapper tCommentInfoMapper; @Resource private TCommentInfoMapper tCommentInfoMapper2;
@Autowire和@Resource註解對比
在我看來@Autowire和@Resource有兩個區別:
一、@Resource是J2EE提供的,@Autowire是Spring提供的
二、兩個註解使用name區別註入的寫法不同
三、然後就沒有什麼不同瞭
網上很多人專門介紹@Resource能夠用變量名或set方法裡的變量名作為對象name來使用,說的好像@Autowire就不能似的.
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 基於@Autowierd(自動裝配)的使用說明
- 深入分析@Resource和@Autowired註解區別
- Java面試題沖刺第十八天–Spring框架3
- Spring的@Autowired加到接口上但獲取的是實現類的問題
- Spring Bean自動裝配入門到精通