从Spring 3.0开始,Spring提供对JSR-330标准注解(依赖注入)的支持。这些注解的扫描方式与Spring注解相同。要使用它们,您需要在类路径中包含相关的jar。
如果您使用Maven,则javax.inject工件可在标准Maven存储库中找到( http://repo1.maven.org/maven2/javax/inject/javax.inject/1/)。您可以将以下依赖项添加到文件pom.xml:
javax.inject javax.inject 1
而不是@Autowired,您可以使用@javax.inject.Inject如下:
import javax.inject.Inject;
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Inject
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
public void listMovies() {
this.movieFinder.findMovies(...);
...
}
}
与此同时@Autowired,您可以@Inject在字段级别,方法级别和构造函数 - 参数级别使用。此外,您可以将注入点声明为a Provider,允许按需访问较短范围的bean或通过Provider.get()调用对其他bean进行延迟访问。以下示例提供了前面示例的变体:
import javax.inject.Inject;
import javax.inject.Provider;
public class SimpleMovieLister {
private Provider movieFinder;
@Inject
public void setMovieFinder(Provider movieFinder) {
this.movieFinder = movieFinder;
}
public void listMovies() {
this.movieFinder.get().findMovies(...);
...
}
}
如果要为应注入的依赖项使用限定名称,则应使用@Named注释,如以下示例所示:
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;
}
// ...
}
与之一样@Autowired,@Inject也可以与java.util.Optional或 一起使用@Nullable。这在这里更适用,因为@Inject没有required属性。以下一对示例显示了如何使用@Inject和 @Nullable:
public class SimpleMovieLister {
@Inject
public void setMovieFinder(Optional movieFinder) {
...
}
}
public class SimpleMovieLister {
@Inject
public void setMovieFinder(@Nullable MovieFinder movieFinder) {
...
}
}
@Component您可以使用@javax.inject.Named或代替,javax.annotation.ManagedBean如下例所示:
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或时@ManagedBean,可以使用与使用Spring注释时完全相同的方式使用组件扫描,如以下示例所示:
@Configuration
@ComponentScan(basePackages = "org.example")
public class AppConfig {
...
}
与此相反@Component,JSR-330 @Named和JSR-250 ManagedBean 注释不可组合。您应该使用Spring的构造型模型来构建自定义组件注释。
使用标准注解时,您应该知道某些重要功能不可用,如下表所示:
表6. Spring组件模型元素与JSR-330变体
Spring | javax.inject.* | javax.inject restrictions / comments |
---|---|---|
@Autowired | @Inject | @Inject没有“必需”属性。可以与Java 8一起使用Optional。 |
@Component | @Named / @ManagedBean | JSR-330不提供可组合模型,只是一种识别命名组件的方法。 |
@Scope(“singleton”) | @Singleton | JSR-330默认范围就像Spring一样prototype。但是,为了使其与Spring的一般默认值保持一致,singleton默认情况下在Spring容器中声明的JSR-330 bean是一个默认值。为了使用除以外的范围singleton,您应该使用Spring的@Scope注释。javax.inject还提供了 @Scope注释。然而,这个仅用于创建自己的注释。 |
@Qualifier | @Qualifier / @Named | javax.inject.Qualifier只是构建自定义限定符的元注释。具体String限定符(如@Qualifier带有值的Spring )可以通过关联javax.inject.Named。 |
@Value | - | 没有等价物 |
@Required | - | 没有等价物 |
@Lazy | - | 没有等价物 |
ObjectFactory | Provider | javax.inject.Provider是Spring的直接替代品ObjectFactory,只有较短的get()方法名称。它也可以与Spring @Autowired或非注释构造函数和setter方法结合使用。 |