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

ams*_*ams 106 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. 你应该如何告诉Runtime系统一个类应该可以在其他类中注入什么是注释?相当于@Component春天?

更新1有一个很好的解释,@Named@Qualifier在尼斯文章@Named@Qualifier http://java.dzone.com/articles/java-ee6-cdi-named-components感谢@xmedeko链接到它下面的评论.

sbr*_*ges 78

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

@Named("maxWaitTime")
public long maxWaitTimeMs;

@Named("minWaitTime")
public long minWaitTimeMs;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 关于`@ Named`和`@ Qualifier`的好文章http://java.dzone.com/articles/java-ee6-cdi-named-components (27认同)

小智 53

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

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


sou*_*ica 7

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

此包提供了启用可移植类的依赖项注入注释,但它将外部依赖项配置留给了注入器实现.

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


abb*_*bas 5

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