我應該在DI中使用哪一個註釋@Resource ( jsr250 )或@Autowired (特定於Spring)? spring
我過去已成功使用@Resource(name="blah")
和@Autowired @Qualifier("blah")
函數
個人直覺是堅持使用@Resource
標記,由於它已被jsr人士批准。
有人對此有強烈的想法嗎? spa
@Autowired
(或@Inject
)和@Resource
能夠很好地工做。 可是在概念上或意義上存在差別 .net
@Resource
意思是讓我知道一個已知的資源 。 該名稱是從帶註釋的設置器或字段的名稱中提取的,或者是從名稱-Parameter中獲取的。 @Inject
或@Autowired
嘗試按類型鏈接合適的其餘組件 。 所以,基本上,這是兩個大相徑庭的概念。 不幸的是, @Resource
的Spring-Implementation具備內置的後備功能,當解析按名稱失敗時會啓用該功能。 在這種狀況下,它會按類型退回到@Autowired
-kind分辨率。 雖然這種後備方式很方便,可是恕我直言,它引發了不少混亂,由於人們沒有意識到概念上的差別,而且傾向於使用@Resource
進行基於類型的自動裝配。 code
做爲一個說明這裏: SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext
和SpringBeanAutowiringSupport.processInjectionBasedOnServletContext
與不工做@Resource
註解。 所以,有區別。 component
這是我從Spring 3.0.x參考手冊中得到的 : 對象
小費 blog
若是您打算經過名稱表示註釋驅動的注入,則即便技術上能夠經過@Qualifier值引用bean名稱,也不要主要使用@Autowired。 而是使用JSR-250 @Resource批註,該批註的語義定義是經過其惟一名稱標識特定的目標組件,而聲明的類型與匹配過程無關。 資源
因爲這種語義差別的特定結果,自己定義爲集合或映射類型的bean沒法經過@Autowired注入,由於類型匹配不適用於它們。 對此類bean使用@Resource,經過惟一名稱引用特定的collection或map bean。 get
@Autowired適用於字段,構造函數和多參數方法,從而容許在參數級別縮小限定符註釋的範圍。 相比之下,只有具備單個參數的字段和bean屬性設置器方法才支持@Resource。 所以,若是注入目標是構造函數或多參數方法,請堅持使用限定符。
@Resource
一般由經過JNDI定義的高級對象使用。 @Autowired
或@Inject
將被更多的普通bean使用。
據我所知,它不是規範,也不是約定。 這是標準代碼使用這些批註的邏輯方式。
我想強調@Jules對這個問題的回答 。 該註釋帶來了一個有用的連接: 帶有@ Resource,@ Autowired和@Inject的Spring Injection 。 我鼓勵您完整閱讀它,可是這裏簡要概述了它的有用性:
@Autowired
和@Inject
@Resource
明確命名您的組件[@Component(「 beanName」)]
將@Resource
與name
屬性[@Resource(name =「 beanName」)]一塊兒使用
@Qualifier
? 除非要建立相似bean的列表,不然避免使用@Qualifier
批註。 例如,您可能想用特定的@Qualifier
批註標記一組規則。 這種方法使將一組規則類注入到可用於處理數據的列表中變得很簡單。
掃描組件的特定程序包[context:component-scan base-package="com.sourceallies.person"]
。 雖然這將致使更多的component-scan
配置,但它減小了將沒必要要的組件添加到Spring上下文的機會。