【问题标题】:What is javax.inject.Named annotation supposed to be used for?javax.inject.Named 注释应该用于什么?
【发布时间】:2011-07-21 21:03:59
【问题描述】:

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

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

【问题讨论】:

  • JSR-330 的配置超出规范,即容器特定。
  • 根据 Spring 文档“JSR 330 的 @Named 注释可用作检测组件并为它们提供名称的方法。如果您启用了 JSR 330 JAR,则会自动启用此行为类路径。”这种行为是 Spring 独有的还是所有理解 @Named 的容器独有的?

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


【解决方案1】:

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

@Named("maxWaitTime")
public long maxWaitTimeMs;

@Named("minWaitTime")
public long minWaitTimeMs;

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

  • 如果您想创建类似于@Named 的注释,请在创建它们时使用@Qualifier 注释。

  • 如果您查看@Named,它本身就带有@Qualifier 注释。

【讨论】:

  • 所以@Named 确实是@Qualifier,那么为什么@Qualifier 需要如此通用,是允许使用javax.inject 的人定义诸如@Repository、@Service、@Controller 之类的刻板印象的想法被标记为@Qualifier?
  • 我不确定你所说的刻板印象是什么意思。如果你的意思是添加新的注解来区分同一类型的不同实例,那么是的。
  • 例如,您可以使用@MaxWaitTime 来代替@Named("maxWaitTime")。它只是更干净一点。
  • 关于@Named@Qualifierjava.dzone.com/articles/java-ee6-cdi-named-components的好文章
  • 我不明白...你不能通过它们不同的变量名来区分它们吗?
【解决方案2】:

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

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

【讨论】:

  • “注入 bean”这个短语是模棱两可的;您的意思是“满足该 bean 的所有依赖项”还是“将该 bean 注入具有它作为依赖项的东西”?
  • 在哪里可以找到 Spring 注释的 JSR 对应项列表?
  • 注入一个 bean - “将该 bean 注入到有它作为依赖项的东西中”
  • 对不起 Pawan,我不熟悉 Spring 注释对应的 JSR 列表
【解决方案3】:

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

这个包提供依赖 启用的注入注释 可移植的课程,但它离开了 外部依赖配置up 到注入器实现。

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-03
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      • 2019-11-23
      • 1970-01-01
      • 2015-01-31
      相关资源
      最近更新 更多