什么是javax.inject.Named注释应该用于?

时间:2011-03-24 05:46:19

标签: java spring dependency-injection java-ee-6

我正在尝试理解javax.inject包,我不清楚javax.inject.Named注释应该用于什么。 Javadoc没有解释它背后的想法。

Javadoc位于http://download.oracle.com/javaee/6/api/javax/inject/Named.html

我正在使用 Spring 3.0 编写一些示例程序,将@Named放在bean上似乎将它添加到bean工厂但是Javadoc描述很轻我可以'告诉我这是标准行为还是Spring特定行为。

我的问题是:

  1. @Named@Qualifier
  2. 之间的区别
  3. 你应该如何告诉Runtime系统一个类应该可以在其他类中注入什么是注释?相当于Spring中的@Component
  4. 更新1 有关@Named@Qualifier在Nice文章中对@Named@Qualifier http://java.dzone.com/articles/java-ee6-cdi-named-components的一个很好的解释,谢谢@xmedeko用于链接下面的评论。

4 个答案:

答案 0 :(得分:70)

使用@Named来区分在同一范围内绑定的相同类型的不同对象。

@Named("maxWaitTime")
public long maxWaitTimeMs;

@Named("minWaitTime")
public long minWaitTimeMs;

如果没有@Named限定符,注入器将不知道绑定到哪个变量的长度。

如果要创建类似于@Named的注释,请在创建时使用@Qualifier注释。如果你看@Named,它本身就用@Qualifier注释。

答案 1 :(得分:46)

@Inject而不是Spring的@Autowired来注入一个bean @Named而不是Spring的@Component来声明一个bean。

那些 JSR-330 标准注释的扫描和检索方式与Spring注释相同(只要以下jar在您的类路径中)

答案 2 :(得分:7)

关于#2,根据JSR-330规范:

  

此包提供依赖性   启用注入注释   便携式课程,但它离开了   外部依赖配置   注入器实现。

因此,由提供者决定哪些对象可用于注入。在Spring的情况下,它都是Spring bean。使用AnnotationConfigApplicationContext时,任何使用JSR-330注释注释的类都会自动添加为Spring bean。

答案 3 :(得分:3)

@Named注释的主要作用是定义一个bean,用于解析应用程序中的EL语句,通常是通过JSF EL解析器。注射可以使用名称进行,但这并不是CDI注射的工作原理,因为CDI为我们提供了一种更丰富的方式来表达注射点和注入它们的豆类。