2012-02-02 138 views
26

我沒有看到兩種方式之間的區別,@Qualifier總是與@Autowired一起使用。@Qualifier和@Resource之間的區別

@Autowired 
@Qualifier("alpha") 

VS

@Resource(name="alpha") 

任何人都可以讓我知道有什麼區別?謝謝!

+0

[@Resource vs @Autowired]可能的重複(http://stackoverflow.com/questions/4093504/resource-vs-autowired) – skaffman 2012-02-02 09:24:06

回答

49

@Autowired可以單獨使用。如果單獨使用,它將按類型連線。因此,如果在容器中聲明瞭多個相同類型的Bean,則@Autowired不知道要使用哪個bean注入的問題。因此,請使用@Qualifier@Autowired一起說明通過指定bean名稱(通過名稱連接)實際連接的bean。

@Resource也通過名稱連接。因此,如果@Autowired@Qualifier一起使用,則與@Resource相同。

區別在於@Autowired@Qualifier是彈簧註釋,而@Resource是標準java註釋(來自JSR-250)。另外,@Resource只支持字段和setter注入,而@Autowired支持字段,setter,構造函數和多參數方法注入。

建議使用@Resource進行字段和setter注入。堅持使用@Qualifier@Autowired作構造函數或多參數方法注入。

this

如果要表達的名字註解驅動的注入,不 主要使用@Autowired - 即使是在技術上能夠通過@Qualifier值指 一個bean的名字。相反,更喜歡JSR-250 @資源註釋,它的語義定義是通過其唯一的名稱來標識特定的目標組件,其中聲明的類型 與匹配過程無關。

+0

它在哪裏說的?如果你想通過名字自動裝載,我發現它說要使用它,我不知道它在哪裏建議使用資源(在某些情況下它實際上不會工作)。 – 2012-02-02 03:04:42

+0

更新。它在3.11.3的提示部分中說過 – 2012-02-02 03:11:41

3

@Autowired是老派的春天。 @Resource是Java EE CDI標準。 Spring處理這兩個(以及@Inject,這非常相似),並且在兩種情況下都做了幾乎相同的事情。我會推薦@Resource,@Autowired是在標準之前制定的,並且似乎主要是爲了向後兼容性而提供支持。

+0

所以你的意思是@Resource是當前的春季標準。我們應該在我們的Spring beans中使用@Resource而不是@ Autowired – 2017-07-18 06:49:39

4

我面臨着@Autowired一些問題,然後使用@Qualifier開始,我終於能夠找出定義相同類型的多個Bean時用於@Autowired @Qualifier用。

假設你定義2種豆同一類型但不同的價值觀:

<bean id="appContext1" class="com.context.AppContext"> 
    <constructor-arg value="abc" /> 
<bean/> 
<bean id="appContext2" class="com.context.AppContext"> 
    <constructor-arg value="ABC" /> 
<bean/> 

然後,如果你只是要使用@Autowire,那麼你必須使用相同的變量名作爲bean名字否則它的會發現多個類型的錯誤。

@Autowired 
AppContext appContext; 

對於上述用例,您必須使用限定符。

@Autowired 
@Qualifier("appContext1") 
AppContext appContext; 

而是,如果使用與bean名稱相同的變量名稱,則可以消除@Qualifier的使用。

@Autowired 
AppContext appContext1; 

我總是使用變量名同bean的名字,卻意外地有一些其他的變量名和麪臨這個問題。

讓我知道是否有任何疑問。

相關問題