• Spring IOC之 使用JSR 330标准注解


    从Spring 3.0开始,Spring提供了对 JSR 330标准注解的支持。这些注解可以喝Spring注解一样被扫描到。你只需要将相关的Jar包加入到你的classpath中即可。

    注意:如果你使用Maven,javax.inject子包是需要在标准Maven仓库中用到的(http://repo1.maven.org/maven2/javax/inject/javax.inject/1/),你需要添加下面的依赖到你的pom.xml文件中。
    
    <dependency>
     <groupId>javax.inject</groupId>
     <artifactId>javax.inject</artifactId>
     <version>1</version>
    </dependency>	
    

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

    和@Autowired一样,尽可能的在类级别、域级别、方法级别和构造器参数级别来使用@Inject。如果你需要给需要依赖的注入指定限定的名字,你可以使用@Name注解即可:

    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注解

    可以替代@Component注解,@javax.inject.Named可以这样被使用:

    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的时候,可以像使用Spring注解一样来使用组件扫描:

    <beans>
     <context:component-scan base-package="org.example"/>
    </beans>
    

    标准方式的限制

    当使用标准注解的使用,知道一些有意义的功能但不是可用的是有必要的:

    Spring javax.inject.* javax.inject 限制和 说明
    @Autowird @Inject @Inject没有required属性
    @Component @Named
    @Scope("singleton") @Singleton JSR 330默认的作用域像Spring的prototype。但是,为了和Spring的默认值相同,声明在Spring容器中的JSR 330 bean的默认作用域是singleton。为了使用一个不是singleton的作用域,你应该使用Spring的注解@Scope 注解。javax.inject也提供了一个注解,不过这个注解只是用于创建你自己的注解
    @Qualifier @Named
    @Value 没有等价
    @Required 没有等价
    @Lazy 没有等价
  • 相关阅读:
    devenv.exe与devenv.com
    [LeetCode 132] 回文分割II(Palindrome Partitioning II)
    [翻译]More C++ Idioms 取址器(Address of)
    [LeetCode 131] 回文分割(Palindrome Partitioning)
    [翻译]More C++ Idioms 类成员检测器
    C++类的隐式默认构造函数
    [翻译]More C++ Idioms 通过初始化挂接(Attach by Initialization)
    【转】来自微软的纯CSS下拉菜单
    引用asp.net母版页后,母版页和内容页的页面事件执行顺序
    如何解决无法显示隐藏文件/文件夹
  • 原文地址:https://www.cnblogs.com/zhangminghui/p/4266590.html
Copyright © 2020-2023  润新知