@Resource vs @Autowired

我應該在DI中使用哪一個註釋@Resourcejsr250 )或@Autowired (特定於Spring)? spring

我過去已成功使用@Resource(name="blah")@Autowired @Qualifier("blah") 函數

個人直覺是堅持使用@Resource標記,由於它已被jsr人士批准。
有人對此有強烈的想法嗎? spa


#1樓

@Autowired (或@Inject )和@Resource能夠很好地工做。 可是在概念上或意義上存在差別 .net

  • @Resource意思是讓我知道一個已知的資源 。 該名稱是從帶註釋的設置器或字段的名稱中提取的,或者是從名稱-Parameter中獲取的。
  • @Inject@Autowired嘗試按類型鏈接合適的其餘組件

所以,基本上,這是兩個大相徑庭的概念。 不幸的是, @Resource的Spring-Implementation具備內置的後備功能,當解析按名稱失敗時會啓用該功能。 在這種狀況下,它會按類型退回到@Autowired -kind分辨率。 雖然這種後備方式很方便,可是恕我直言,它引發了不少混亂,由於人們沒有意識到概念上的差別,而且傾向於使用@Resource進行基於類型的自動裝配。 code


#2樓

做爲一個說明這裏: SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContextSpringBeanAutowiringSupport.processInjectionBasedOnServletContext工做@Resource註解。 所以,有區別。 component


#3樓

這是我從Spring 3.0.x參考手冊中得到的對象

小費 blog

若是您打算經過名稱表示註釋驅動的注入,則即便技術上能夠經過@Qualifier值引用bean名稱,也不要主要使用@Autowired。 而是使用JSR-250 @Resource批註,該批註的語義定義是經過其惟一名稱標識特定的目標組件,而聲明的類型與匹配過程無關。 資源

因爲這種語義差別的特定結果,自己定義爲集合或映射類型的bean沒法經過@Autowired注入,由於類型匹配不適用於它們。 對此類bean使用@Resource,經過惟一名稱引用特定的collection或map bean。 get

@Autowired適用於字段,構造函數和多參數方法,從而容許在參數級別縮小限定符註釋的範圍。 相比之下,只有具備單個參數的字段和bean屬性設置器方法才支持@Resource。 所以,若是注入目標是構造函數或多參數方法,請堅持使用限定符。


#4樓

@Resource一般由經過JNDI定義的高級對象使用。 @Autowired@Inject將被更多的普通bean使用。

據我所知,它不是規範,也不是約定。 這是標準代碼使用這些批註的邏輯方式。


#5樓

我想強調@Jules這個問題的回答 。 該註釋帶來了一個有用的連接: 帶有@ Resource,@ Autowired和@Inject的Spring Injection 。 我鼓勵您完整閱讀它,可是這裏簡要概述了它的有用性:

註釋如何選擇正確的實現?

@Autowired@Inject

  1. 按類型匹配
  2. 受預選賽限制
  3. 按名稱匹配

@Resource

  1. 按名稱匹配
  2. 按類型匹配
  3. 受限定詞限制(若是按名稱找到匹配項則忽略)

我應該使用哪些註釋(或它們的組合)來注入個人bean?

  1. 明確命名您的組件[@Component(「 beanName」)]

  2. @Resourcename屬性[@Resource(name =「 beanName」)]一塊兒使用

爲何我不該該使用@Qualifier

除非要建立相似bean的列表,不然避免使用@Qualifier批註。 例如,您可能想用特定的@Qualifier批註標記一組規則。 這種方法使將一組規則類注入到可用於處理數據的列表中變得很簡單。

注入豆會減慢個人程序嗎?

掃描組件的特定程序包[context:component-scan base-package="com.sourceallies.person"] 。 雖然這將致使更多的component-scan配置,但它減小了將沒必要要的組件添加到Spring上下文的機會。


參考: 使用@ Resource,@ Autowired和@Inject進行Spring注入

相關文章
相關標籤/搜索