@Autowired和@Resource的區別

申辉發表於2024-09-11

1--@Autowired

@AutowiredSpring裡面提供的一個註解,它預設是根據型別來實現Bean的依賴注入;

@Autowired裡面有一個required屬性,預設值是true 表示強制要求bean例項的一個注入,在應用啟動的時候,如果IOC容器中不存在對應型別的bean,那麼啟動就會報錯;如果我們不希望實現依賴注入就可以把這個屬性設定為false

其次如果Spring IOC容器中存在多個相同型別的bean例項,但是由於@Autowired是根據型別去進行注入的,所以Spring啟動的時候就會提示一個錯誤,就是原本只能注入一個單例項Bean,但是現在Ioc容器存在多個,導致注入失敗;針對這個問題,可以使用@Primary @Qualifier這兩個註解來解決;

@Primary表示主要的Bean,當存在多個相同型別的Bean的時候,會優先使用宣告瞭@Primary註解的一個Bean

@Qualifier 相當於條件篩選,可以根據Bean的名字可以去找到需要裝配的目標Bean

2--@Resource

@Resource是JDK中提供的一個註解,只不過Spring在實現上提供了這個註解的一個功能支援,它的使用方式和@Autowired類似,

最大的區別就是@Resource可以支援ByName 和 ByType兩種注入方式;

  • 如果使用name屬性,spring會根據bean的名字來進行依賴注入;
  • 如果使用type屬性,spring會根據bean的型別來進行依賴注入,如果兩個屬性都沒有進行設定,@Resource預設是根據定義的屬性名字去容器中進行匹配,如果沒有匹配成功,再根據型別來匹配;
  • 如果兩個都沒有匹配到就會報錯

3--注入方式

@Autowired 支援構造方法注入,屬性注入,Setter方法注入

@Resource 只支援屬性注入,Setter方法注入 不支援構造方法注入

相關文章