2011-03-24 66 views
81

我想了解javax.inject包,我不清楚javax.inject.Named注释应该用于什么。 Javadoc没有解释它背后的想法。什么是应该用于javax.inject.Named注释?

的Javadoc是http://download.oracle.com/javaee/6/api/javax/inject/Named.html

我使用春3.0写一些示例程序,通过把@Named它似乎将它添加到bean工厂,但Javadoc中描述一个bean是如此之轻,我可以”不知道这是标准行为还是Spring特定行为。

我的问题是:

  1. 是什么如何是你应该告诉运行系统一类应该是注射在其他班级有什么该注释@Named@Qualifier
  2. 之间的区别?在春季相当于@Component

更新1存在的@Named@Qualifier在尼斯的文章极好解释有关@Named@Qualifierhttp://java.dzone.com/articles/java-ee6-cdi-named-components感谢@xmedeko下面链接到它的注释。

+0

JSR-330的配置超出了规范,即特定于容器。 – 2011-03-24 07:13:05

+1

根据Spring文档,“JSR 330的@named注释可以用作检测组件并为它们提供名称的一种方法。如果您在类路径中有JSR 330 JAR,则会自动启用此行为。”这种行为对于Spring或所有理解@Named的容器都是唯一的吗? – ams 2011-03-24 08:24:24

回答

54

使用@Named在同一范围的约束的相同类型的不同对象之间进行区分。

@Named("maxWaitTime") 
public long maxWaitTimeMs; 

@Named("minWaitTime") 
public long minWaitTimeMs; 

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

如果你想创建一个像@Named注释,创建它们时,使用@Qualifier注解。如果你看@Named,它本身是用@Qualifier注释的。

+0

所以@Name真的是@Qualifier,那么为什么@Qualifier要求如此通用,是否允许某人使用javax.inject来定义像@ Repository,@ Service,@ Controller这样的标记为@Qualifier的构造型? – ams 2011-03-24 06:09:20

+0

我不确定你的意思是关于刻板印象。如果你的意思是添加新的注释来区分同一类型的不同实例,那么是的。 – sbridges 2011-03-24 12:49:39

+0

例如,您可以使用@MaxWaitTime来代替@Named(“maxWaitTime”)。这只是一个小清洁剂。 – sourcedelica 2011-03-24 13:07:04

7

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

该包提供依赖 注入注释,使 便携式类,但它留下 外部依赖配置起来 到喷射器实现。

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

31

@Inject而不是Spring的@Autowired注入一个bean。
@命名而不是Spring的@Component来声明一个bean。
这些JSR-330标准注释以与Spring注释相同的方式进行扫描和检索(只要以下jar包含在类路径中)

+0

短语“注入bean”是不明确的;你的意思是“满足所有这些bean的依赖关系”,还是你的意思是“将这个bean注入到具有它作为依赖的东西中”? – 2016-04-26 23:49:58

+0

我在哪里可以找到JSR对应列表以弹出注释? – Pawan 2017-05-04 07:16:32

+0

注入一个bean - “将这个bean注入到具有它作为依赖项的东西” – 2017-05-08 19:38:31

2

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

相关问题