The IoC Container 1.11

作者: 小鲍比大爷 | 来源:发表于2019-02-24 22:24 被阅读0次

    1.11. Using JSR 330 Standard Annotations

    Spring支持JSR 330的注解,如果想使用,需要引入下面的包:

    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
        <version>1</version>
    </dependency>
    

    1.11.1. Dependency Injection with @Inject and @Named
    @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(...);
            ...
        }
    }
    

    @Inject can also be used with java.util.Optional or @Nullable:

    public class SimpleMovieLister {
    
        @Inject
        public void setMovieFinder(Optional<MovieFinder> movieFinder) {
            ...
        }
    }
    
    public class SimpleMovieLister {
    
        @Inject
        public void setMovieFinder(@Nullable MovieFinder movieFinder) {
            ...
        }
    }
    

    @Named可以用来指定bean name,Spring就会按照bean的名称进行查找:

    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;
        }
    
        // ...
    }
    

    1.11.2. @Named and @ManagedBean: Standard Equivalents to the @Component Annotation

    可以用@Named和@ManagedBean代替@Component:

    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;
        }
    
        // ...
    }
    

    @Named也可以和@Component一样不指定参数:

    import javax.inject.Inject;
    import javax.inject.Named;
    
    @Named
    public class SimpleMovieLister {
    
        private MovieFinder movieFinder;
    
        @Inject
        public void setMovieFinder(MovieFinder movieFinder) {
            this.movieFinder = movieFinder;
        }
    
        // ...
    }
    

    组件扫描的配置方式跟之前一致:

    @Configuration
    @ComponentScan(basePackages = "org.example")
    public class AppConfig  {
        ...
    }
    

    1.11.3. Limitations of JSR-330 Standard Annotations

    JSR-330注解的限制

    相关文章

      网友评论

        本文标题:The IoC Container 1.11

        本文链接:https://www.haomeiwen.com/subject/zlriyqtx.html