我正在尝试理解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特定行为。
我的问题是:
@Named
和@Qualifier
@Component
更新1 有关@Named
和@Qualifier
在Nice文章中对@Named
和@Qualifier
http://java.dzone.com/articles/java-ee6-cdi-named-components的一个很好的解释,谢谢@xmedeko用于链接下面的评论。
答案 0 :(得分:70)
使用@Named来区分在同一范围内绑定的相同类型的不同对象。
@Named("maxWaitTime")
public long maxWaitTimeMs;
@Named("minWaitTime")
public long minWaitTimeMs;
如果没有@Named限定符,注入器将不知道绑定到哪个变量的长度。
如果要创建类似于@Named的注释,请在创建时使用@Qualifier注释。如果你看@Named,它本身就用@Qualifier注释。
答案 1 :(得分:46)
@Inject
而不是Spring的@Autowired
来注入一个bean
@Named
而不是Spring的@Component
来声明一个bean。
那些 JSR-330 标准注释的扫描和检索方式与Spring注释相同(只要以下jar
在您的类路径中)
答案 2 :(得分:7)
关于#2,根据JSR-330规范:
此包提供依赖性 启用注入注释 便携式课程,但它离开了 外部依赖配置 注入器实现。
因此,由提供者决定哪些对象可用于注入。在Spring的情况下,它都是Spring bean。使用AnnotationConfigApplicationContext时,任何使用JSR-330注释注释的类都会自动添加为Spring bean。
答案 3 :(得分:3)
@Named注释的主要作用是定义一个bean,用于解析应用程序中的EL语句,通常是通过JSF EL解析器。注射可以使用名称进行,但这并不是CDI注射的工作原理,因为CDI为我们提供了一种更丰富的方式来表达注射点和注入它们的豆类。