文章参考来源:Spring Framework官方文档
从Spring 3.0开始,Spring提供了对JSR-330标准注解(依赖注入)的支持。这些注释的扫描方式与Spring注解扫描方式相同。
@Configuration
@ComponentScan(basePackages = "org.example")
public class AppConfig {
// ...
}
要使用它们,需要将相关的jar包保存在类路径中。假设使用的是Maven,格式如下:
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
在JSR-330标准注解中,@Inject 和@Named可以实现Spring注解中@Autowired和@Qualifier的效果,且用法基本相同。
import javax.inject.Inject;
import javax.inject.Named;
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Inject
public void setMovieFinder(@Named("main") MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// ...
}
对于Spring中的@Component,@javax.inject.Named 结合 javax.annotation.ManagedBean同样可以实现相同效果。
import javax.inject.Inject;
import javax.inject.Named;
@Named("movieListener") // @ManagedBean("movieListener") could be used as well
//@Named 不指定名称也是可以使用的
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Inject
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// ...
}
但是和@Component相比,JSR-330 的@Named 和JSR-250的@ManagedBean不可以实现再组合。(比如Spring的@Service组合成分包括@Component)
JSR-330注解的限制
(和Spring相比)
Spring | javax.inject.* | javax.inject.*的限制 |
---|---|---|
@Autowired | @Inject | @Inject没有required属性,可以使用 Java 8’s Optional代替 |
@Component | @Named / @ManagedBean | JSR-330没有提供可组合的模型,仅是一种识别已命名组件的方法 |
@Scope(“singleton”) | @Singleton | JSR-330默认作用域类似于Spring的原型(prototype)。然而,为了使它与Spring的一般默认值保持一致,在Spring容器中声明的JSR-330 bean在默认情况下是一个单例对象(singleton)。为了使用除singleton之外的作用域,您应该使用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方法结合使用 |