可以使用 @javax.inject.Inject代替 @Autowired
import javax.inject.Inject;public class SimpleMovieLister {private MovieFinder movieFinder;@Injectpublic 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;@Injectpublic 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;@Injectpublic void setMovieFinder(@Named("main") MovieFinder movieFinder) {this.movieFinder = movieFinder;}// ...}
和 @Autowired一样,@Inject也可以和 java.util.Optional或 @Nullable一起使用。这在这里更加适用,因为 @Inject没有一个必需属性。下面的一对例子展示了如何使用 @Inject和 @Nullable。
public class SimpleMovieLister {@Injectpublic void setMovieFinder(Optional<MovieFinder> movieFinder) {// ...}}
public class SimpleMovieLister {@Injectpublic void setMovieFinder(@Nullable MovieFinder movieFinder) {// ...}}
