1.11.2. @Named 和@ManagedBean: @Component注释的标准等价物
您可以使用@javax.inject.Named或javax.annotation.ManagedBean而不是@Component,如下示例所示:
import javax.inject.Inject;
import javax.inject.Named;
@Named("movieListener") // @ManagedBean("movieListener") could be used as well
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Inject
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// ...
}
在不指定组件名称的情况下使用@Component是非常常见的。@Named 可以以类似的方式使用,如下示例所示:
import javax.inject.Inject;
import javax.inject.Named;
@Named
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Inject
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// ...
}
当使用@Named或@ManagedbBean时,可以使用与使用Spring注释完全相同的组件扫描,如下示例所示:
@Configuration
@ComponentScan(basePackages = "org.example")
public class AppConfig {
...
}
与@Component不同,JSR-330的@Named和JSR-250的@ManagedBean注释是不可组合的。您应该使用Spring的构造型模型来构建自定义组件注释。
1.11.3. JSR-330标准注释的局限性
当使用标准注释时,您应该知道一些重要功能不可用,如下表所示:
表6.Spring组件模型元素与JSR-330变量
Spring | javax.inject.* |
javax.inject限制/说明 |
---|---|---|
@Autowired | @Inject | @Inject 没有“required'”属性。可以与Java 8的可选选项一起使用。 |
@Component | @Named / @ManagedBean | JSR-330不提供可组合模型,只提供一种识别命名组件的方法。 |
@Scope("singleton") | @Singleton | JSR-330默认范围类似于Spring的原型。但是,为了使其与Spring的一般默认值保持一致,在Spring容器中声明的JSR-330 bean在默认情况下是单例的。为了使用单例之外的作用域,应该使用spring的@Scope注释。javax.inject 还提供了@Scope注释。不过,这一个只用于创建您自己的注释。 |
@Qualifier | @Qualifier / @Named | javax.inject.Qualifier 只是用于构建自定义限定符的元注释。具体的字符串限定符(如Spring的具有值的@Qualifier)可以通过javax.inject.Named关联。 |
@Value | - | 无等性的值 |
@Required | - | 无等性的值 |
@Lazy | - | 无等性的值 |
ObjectFactory | Provider | javax.inject.Provider是Spring的ObjectFactory的直接替代品,它只使用了较短的get()方法名。它还可以与Spring的@Autowired结合使用,或者与无注释的构造函数和setter方法结合使用。 |