注释是用来做什么的?

我试图理解 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. 如何告诉运行时系统一个类应该可以在其他类中注入呢?相当于春天的 @Component

更新1 在尼斯有一篇关于 @Named@Qualifier的文章,对 @Named@Qualifier做了很好的解释,https://dzone.com/articles/java-ee6-cdi-named-components感谢@xmedeko 链接到下面的评论。

196401 次浏览

在同一范围内绑定的同一类型的不同对象之间使用 @Named区别对待

@Named("maxWaitTime")
public long maxWaitTimeMs;


@Named("minWaitTime")
public long minWaitTimeMs;

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

  • 如果希望创建行为类似于 @Named的注释,请在创建时使用 @Qualifier注释。

  • 如果您查看 @Named,它本身就是用 @Qualifier进行注释的。

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

这个包提供了依赖关系 启用 可移植的类,但它离开了 外部依赖配置向上 到注射器实现。

因此,由提供程序决定哪些对象可用于注入。在 Spring 的例子中,所有的都是 Spring bean。使用 AnnotationConfigApplicationContext 时,任何带有 JSR-330注释的类都会自动作为 Springbean 添加。

@Inject代替 Spring 的 @Autowired来注入 bean。
@Named代替 Spring 的 @Component来声明 bean

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

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