• Spring核心技术(十)——JSR-330标准注解


    从Spring 3.0开始,Spring开始支持JSR-330标准的注解(依赖注入)。这些注解和Spring注解扫描的方式是一直的,开发者只需要在classpath中配置相关的jar包即可。

    如果开发者使用Maven来管理项目的话,javax.injectartifact在Maven仓库中是可用的(http://repo1.maven.org/maven2/javax/inject/javax.inject/1/)。开发者只需要在pom中引用这个依赖即可。

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

    通过@Inject@Named进行依赖注入

    JSR-330中,@javax.inject.Inject和Spring中的@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在实例变量,方法以及构造参数级别来使用依赖注入。而且,开发者可以将注入声明为Provider,通过Provider.get()来请求那些短作用域或者延迟初始化的Bean。比如如下的例子:

    import javax.inject.Inject;
    import javax.inject.Provider;
    
    public class SimpleMovieLister {
    
        private Provider<MovieFinder> movieFinder;
    
        public void listMovies() {
            this.movieFinder.get().findMovies(...);
            ...
        }
    }

    如果开发者希望来通过名字来限定注入的Bean,可以使用@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;
        }
    
        // ...
    }

    @Named:等同于@Component注解

    JSR-330中,@javax.inject.Named和Spring中的@Component的职责类似:

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

    @Component的使用中经常是不需要指定名字的,@Named注解也是如此:

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

    在使用@Named注解的时候,也同样可以使用组件扫描:

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

    和Spring的@Component组件不同的是,JSR-330的Named注解不可以组合来使用,如果希望自定义组件注解的话,还请使用Spring的组件注解。

    JSR-330标准注解的限制

    当使用JSR-330标准的注解时,了解其和Spring注解的不同点也是十分必要的,参考如下表:

    Spring javax.inject.* javax.inject 限制
    @Autowired @Inject @Inject注解没有required属性,但是可以通过Java 8的Optional取代
    @Component @Named JSR_330标准并没有提供复合的模型,只有一种方式来识别组件
    @Scope(“singleton”) @Singleton JSR-330默认的作用域类似Spring的prototype,然而,为何和Spring的默认保持一致,JSR-330标准中的Bean在Spring中默认也是单例的。如果要使用非单例的作用域,开发者应该使用Spring的@Scope注解。java.inject也提供一个@Scope注解,然而,这个注解仅仅可以用来创建自定义的作用域时才能使用。
    @Qualifier @Qualifier/@Named javax.inject.Qualifier仅仅是一个元注解,用来构建自定义限定符的。而String的限定符(比如Spring中的@Qualifier)可以通过javax.inject.Named来实现
    @Value - 不等价
    @Required - 不等价
    @Lazy - 不等价
    ObjectFactory Provider javax.inject.Provider是SpringObjectFactory的另一个选择,通过get()方法来代理,Provider可以和Spring的@Autowired组合使用
  • 相关阅读:
    最短路径BellmanFord , Dijsktra
    minhash
    eclipse 中使用tomcat
    http 服务
    MongoDB小记
    java post 请求
    hadoop拾遗(五)---- mapreduce 输出到多个文件 / 文件夹
    weka数据挖掘拾遗(二)---- 特征选择(IG、chi-square)
    weka数据挖掘拾遗(一)---- 生成Arff格式文件
    基于SimHash的微博去重
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461550.html
Copyright © 2020-2023  润新知