可以使用 @javax.inject.Inject代替 @Autowired

    1. import javax.inject.Inject;
    2. public class SimpleMovieLister {
    3. private MovieFinder movieFinder;
    4. @Inject
    5. public void setMovieFinder(MovieFinder movieFinder) {
    6. this.movieFinder = movieFinder;
    7. }
    8. public void listMovies() {
    9. this.movieFinder.findMovies(...);
    10. // ...
    11. }
    12. }

    @Autowired一样,你可以在字段级、方法级和构造函数参数级使用 @Inject。此外,你可以将你的注入点声明为一个提供者,允许按需访问较短作用域的 Bean,或通过 Provider.get() 调用懒加载地访问其他 Bean。下面的例子提供了前述例子的一个变体:

    1. import javax.inject.Inject;
    2. import javax.inject.Provider;
    3. public class SimpleMovieLister {
    4. private Provider<MovieFinder> movieFinder;
    5. @Inject
    6. public void setMovieFinder(Provider<MovieFinder> movieFinder) {
    7. this.movieFinder = movieFinder;
    8. }
    9. public void listMovies() {
    10. this.movieFinder.get().findMovies(...);
    11. // ...
    12. }
    13. }

    如果你想为应该被注入的依赖关系使用一个限定的名字,你应该使用 @Named注解,正如下面的例子所示:

    1. import javax.inject.Inject;
    2. import javax.inject.Named;
    3. public class SimpleMovieLister {
    4. private MovieFinder movieFinder;
    5. @Inject
    6. public void setMovieFinder(@Named("main") MovieFinder movieFinder) {
    7. this.movieFinder = movieFinder;
    8. }
    9. // ...
    10. }

    @Autowired一样,@Inject也可以和 java.util.Optional@Nullable一起使用。这在这里更加适用,因为 @Inject没有一个必需属性。下面的一对例子展示了如何使用 @Inject@Nullable

    1. public class SimpleMovieLister {
    2. @Inject
    3. public void setMovieFinder(Optional<MovieFinder> movieFinder) {
    4. // ...
    5. }
    6. }
    1. public class SimpleMovieLister {
    2. @Inject
    3. public void setMovieFinder(@Nullable MovieFinder movieFinder) {
    4. // ...
    5. }
    6. }