關於@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有兩個重要的屬性:nametype,而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。

推薦閱讀: