可以使用 @javax.inject.Inject
代替 @Autowired
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
。此外,你可以将你的注入点声明为一个提供者,允许按需访问较短作用域的 Bean,或通过 Provider.get()
调用懒加载地访问其他 Bean。下面的例子提供了前述例子的一个变体:
import javax.inject.Inject;
import javax.inject.Provider;
public class SimpleMovieLister {
private Provider<MovieFinder> movieFinder;
@Inject
public void setMovieFinder(Provider<MovieFinder> 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
没有一个必需属性。下面的一对例子展示了如何使用 @Inject
和 @Nullable
。
public class SimpleMovieLister {
@Inject
public void setMovieFinder(Optional<MovieFinder> movieFinder) {
// ...
}
}
public class SimpleMovieLister {
@Inject
public void setMovieFinder(@Nullable MovieFinder movieFinder) {
// ...
}
}