2011-03-24 103 views
81

我想了解javax.inject包,我不清楚javax.inject.Named註釋應該用於什麼。 Javadoc沒有解釋它背後的想法。什麼是應該用於javax.inject.Named註釋?

的Javadoc是http://download.oracle.com/javaee/6/api/javax/inject/Named.html

我使用春3.0寫一些示例程序,通過把@Named它似乎將它添加到bean工廠,但Javadoc中描述一個bean是如此之輕,我可以」不知道這是標準行爲還是Spring特定行爲。

我的問題是:

  1. 是什麼如何是你應該告訴運行系統一類應該是注射在其他班級有什麼該註釋@Named@Qualifier
  2. 之間的區別?在春季相當於@Component

更新1存在的@Named@Qualifier在尼斯的文章極好解釋有關@Named@Qualifierhttp://java.dzone.com/articles/java-ee6-cdi-named-components感謝@xmedeko下面鏈接到它的註釋。

+0

JSR-330的配置超出了規範,即特定於容器。 – 2011-03-24 07:13:05

+1

根據Spring文檔,「JSR 330的@named註釋可以用作檢測組件併爲它們提供名稱的一種方法。如果您在類路徑中有JSR 330 JAR,則會自動啓用此行爲。」這種行爲對於Spring或所有理解@Named的容器都是唯一的嗎? – ams 2011-03-24 08:24:24

回答

54

使用@Named在同一範圍的約束的相同類型的不同對象之間進行區分。

@Named("maxWaitTime") 
public long maxWaitTimeMs; 

@Named("minWaitTime") 
public long minWaitTimeMs; 

沒有@Named限定符,注入器不知道要綁定哪個變量。

如果你想創建一個像@Named註釋,創建它們時,使用@Qualifier註解。如果你看@Named,它本身是用@Qualifier註釋的。

+0

所以@Name真的是@Qualifier,那麼爲什麼@Qualifier要求如此通用,是否允許某人使用javax.inject來定義像@ Repository,@ Service,@ Controller這樣的標記爲@Qualifier的構造型? – ams 2011-03-24 06:09:20

+0

我不確定你的意思是關於刻板印象。如果你的意思是添加新的註釋來區分同一類型的不同實例,那麼是的。 – sbridges 2011-03-24 12:49:39

+0

例如,您可以使用@MaxWaitTime來代替@Named(「maxWaitTime」)。這只是一個小清潔劑。 – sourcedelica 2011-03-24 13:07:04

7

關於#2,根據JSR-330規格:

該包提供依賴 注入註釋,使 便攜式類,但它留下 外部依賴配置起來 到噴射器實現。

因此,提供者需要確定哪些對象可用於注射。在Spring的情況下,它都是Spring bean。當使用AnnotationConfigApplicationContext時,任何使用JSR-330批註註釋的類都會自動添加爲Spring bean。

31

@Inject而不是Spring的@Autowired注入一個bean。
@命名而不是Spring的@Component來聲明一個bean。
這些JSR-330標準註釋以與Spring註釋相同的方式進行掃描和檢索(只要以下jar包含在類路徑中)

+0

短語「注入bean」是不明確的;你的意思是「滿足所有這些bean的依賴關係」,還是你的意思是「將這個bean注入到具有它作爲依賴的東西中」? – 2016-04-26 23:49:58

+0

我在哪裏可以找到JSR對應列表以彈出註釋? – Pawan 2017-05-04 07:16:32

+0

注入一個bean - 「將這個bean注入到具有它作爲依賴項的東西」 – 2017-05-08 19:38:31

2

@Named註釋的主要作用是爲目的定義bean通常通過JSF EL解析器來解析應用程序內的EL語句。注射可以通過使用名稱來執行,但這不是CDI注射的工作原理,因爲CDI爲我們提供了一種更加豐富的方式來表達注射點以及注入它們的豆類。

相關問題