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


113

我试图了解该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在Nice文章中有关@Named@Qualifier https://dzone.com/articles/java-ee6-cdi-named-components的文章很好,感谢@xmedeko将其链接到下面的评论。


JSR-330的配置超出规范,即特定于容器。
托尔比约恩Ravn的安德森

1
根据Spring的文档,“ JSR 330的@Named批注可以用作检测组件并为其提供名称的一种方法。如果您在类路径上具有JSR 330 JAR,则会自动启用此行为。” 这对于s​​pring或所有了解@Named的容器来说是唯一的吗?
AMS

Answers:


87

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

@Named("maxWaitTime")
public long maxWaitTimeMs;

@Named("minWaitTime")
public long minWaitTimeMs;

没有@Named限定词,注入器将不知道绑定到哪个变量的时间长。

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

  • 如果您看一下@Named,它本身会带有注释@Qualifier


所以@Named确实是@Qualifier,所以为什么@Qualifier必须如此通用,是否允许使用javax.inject的人定义被标记为@Qualifier的构造型,例如@ Repository,@ Service,@ Controller?
AMS

我不确定您对刻板印象的含义。如果要添加新的注释以区分相同类型的不同实例,则可以。
2011年

例如,可以使用@MaxWaitTime代替@Named(“ maxWaitTime”)。只是有点清洁。
sourcedelica


我不明白...您无法通过它们不同的变量名来区分它们之间的区别吗?
CodyBugstein 2014年

64

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

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


“注入豆子”一词不明确;您的意思是“满足该bean的所有依赖关系”还是“将bean注入具有它的依赖关系的东西”?
Andrew Swan

在哪里可以找到弹簧注释的JSR对应列表?
Pawan

注入一个豆子-“将那个豆子注入一个具有依赖关系的东西中”
Nadav完成

对不起Pawan,我对与Spring注释对应的JSR列表不熟悉
Nadav

8

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

该软件包提供了启用可移植类的依赖项注入批注,但将外部依赖项配置留给了注入器实现。

因此,由提供者确定哪些对象可用于注入。对于Spring,全部是Spring bean。使用AnnotationConfigApplicationContext时,任何带有JSR-330注释的类都会自动添加为Spring Bean。


5

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.