• 20191226 Spring官方文档(Core 1.11)


    1.11。使用JSR 330标准注释

    从Spring 3.0开始,Spring提供对JSR-330标准注释(依赖注入)的支持。这些注释的扫描方式与Spring注释的扫描方式相同。要使用它们,您需要在类路径中有相关的jar。

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

    1.11.1。使用@Inject和@Named的依赖注入

    除了@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。此外,您可以将注入点声明为 Provider,以允许按需访问作用域更小的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没有required属性。以下示例展示了如何使用@Inject和 @Nullable:

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

    1.11.2。@Named和@ManagedBean:@Component注释的标准等效项

    您可以使用@javax.inject.Namedjavax.annotation.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可以不指定组件名称

    当使用@Named@ManagedBean时,可以使用与使用Spring注释完全相同的方式来使用组件扫描,如以下示例所示:

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

    与@Component相比,JSR-330 @Named和JSR-250 ManagedBean 注释是不可组合的。您应该使用Spring的构造型模型来构建自定义组件注释。

    1.11.3。JSR-330标准注释的局限性

    Spring javax.inject.* javax.inject restrictions / comments
    @Autowired @Inject @Inject没有“required”属性。可以与Java 8 Optional一起使用。
    @Component @Named / @ManagedBean JSR-330不提供可组合的模型,仅提供一种识别命名组件的方法。
    @Scope("singleton") @Singleton JSR-330的默认作用域类似于Spring的prototype。但是,为了使其与Spring的默认默认值保持一致,默认情况下,在Spring容器中声明的JSR-330 bean是singleton。为了使用singleton之外的作用域,您应该使用Spring的@Scope注释。javax.inject还提供了@Scope批注。不过,此仅用于创建自己的注释。
    @Qualifier @Qualifier / @Named javax.inject.Qualifier只是用于构建自定义限定符的元注释。具体的String限定词(例如带有值的Spring的@Qualifier)可以通过javax.inject.Named关联。
    @Value - 没有等效
    @Required - 没有等效
    @Lazy - 没有等效
    ObjectFactory Provider javax.inject.Provider是Spring的ObjectFactory直接替代方法,只是get()方法名称较短。它也可以与Spring @Autowired或非注释构造函数和setter方法结合使用。
  • 相关阅读:
    RN-Android构建失败:Caused by: org.gradle.api.ProjectConfigurationException: A problem occurred configuring root project 'AwesomeProject'.
    Android更新包下载成功后不出现安装界面
    真机调试: The application could not be installed: INSTALL_FAILED_TEST_ONLY
    react native 屏幕尺寸转换
    Android Studio生成签名文件,自动签名,以及获取SHA1和MD5值
    React Native安卓真机调试
    git提交代码报错Permission denied, please try again
    The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
    命令行设置快捷命令
    Linux 常用指令
  • 原文地址:https://www.cnblogs.com/huangwenjie/p/12104049.html
走看看 - 开发者的网上家园