2013-12-08 77 views
46

@Inject@Resource@Autowired註釋之間有什麼區別?注入和資源和自動註釋註釋

我們什麼時候應該使用它們中的每一個?

+2

http://docs.spring.io/spring/docs/3.2.4.RELEASE/spring-framework-reference/htmlsingle/#beans-standard-annotations,http://docs.spring.io /spring/docs/3.2.4.RELEASE/spring-framework-reference/htmlsingle/#beans-resource-annotation –

+1

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

+1

我發現的例子很好的解釋是[這裏](http://blogs.sourceallies.com/2011/08/spring-injection-with-resource-and-autowired/) – marioosh

回答

94

@Inject與@Autowire與@Resource的區別?

@Autowired: Spring注入資源(而不是@Inject和@Resource),注入一個資源的類型,即由註釋字段或承包商的接口的類。如果我們很少實現一個接口或子類,我們可以使用@Qualifier註釋縮小選擇範圍,以避免模糊。對於回退匹配,bean名稱被視爲默認限定符值。儘管您可以使用此慣例通過名稱引用特定的bean,但@Autowired基本上是可選的語義限定符的類型驅動注入。

@Inject:註釋基於JSR-330(Java依賴注入)標識可注射的構造方法,方法和字段。這個註解是Spring的@Autowired註解的一個幾乎完整的替代品。因此,您可以選擇使用@Inject,而不是使用特定於Spring的@Autowired註釋。 @Autowired和@Inject之間的差異之一是@Inject沒有必需的字段,所以如果我們找不到合適的對象來注入它將會失敗,而@Autowired可以使用required = false並允許空字段(僅限於如果需要!)。 @Inject註解的好處是,不要直接注入引用,你可以讓@Inject注入一個Provider。提供者接口除其他外,還可以延遲注入bean引用和注入bean的多個實例。 如果我們很少實現一個接口或子類,我們可以使用@Named註釋縮小選擇範圍,以避免模糊。 @Named註釋的作用非常類似於Spring的@Qualifier

@Resource:基於JSR-250的註釋。 @Resource與@Autowired和@Inject非常相似,但主要區別在於找到要注入的bean所需的執行路徑。 @Resource將首先按名稱縮小搜索範圍,然後按類型縮小搜索範圍,最後縮小搜索範圍(如果按名稱找到匹配則忽略)。 @Autowired和@Inject將首先按類型劃分搜索範圍,然後按限定符劃分搜索範圍,最後按名稱縮小搜索範圍。

+5

你能說一些關於建議什麼?最佳實踐? –

+1

我很樂意迴應您的評論,但我更願意保留此答案。你會發佈一個新問題嗎? –

+1

在最後一行中,你提到@Autowired也按名稱搜索,因爲我知道它沒有名稱選項,是嗎? –

1

除了@Haim回答there is good description Spring和JSR-330(依賴注入Java)註釋之間的區別以及如何使用Spring的最後一個。

2
|------------|---------------|---------------|---------------|-----------------------| 
|   | Setter/Field | Constructor | Applicable to | Matching order  | 
|   | injection  | injection  | type   |      | 
|------------|---------------|---------------|---------------|-----------------------| 
| @Resource |  X  |    |  X  | Name, Type, Qualifier | 
|------------|---------------|---------------|---------------|-----------------------| 
| @Autowired |  X  |  X  |    | Type, Qualifier, Name | 
|------------|---------------|---------------|---------------|-----------------------| 
| @Inject |  X  |  X  |    | Type, Qualifier, Name | 
|------------|---------------|---------------|---------------|-----------------------|