🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 4.11 使用 JSR 330 标准注解 从 Spring 3.0 开始,Spring 提供了对 JSR-330 标准注解(依赖注入)的支持。这些注解可 以和 Spring 注解以相同方式被扫描到。你仅仅需要在类路径下添加相关的 jar 包即可。 > ![](https://box.kancloud.cn/2016-01-25_56a58526bb420.gif) > 注意 > 如 果 你 使 用 Maven , 那 么 在 标 准 Maven 仓 库([http://repo1.maven.org/maven2/javax/inject/javax.inject/1/](http://repo1.maven.org/maven2/javax/inject/javax.inject/1/))中 javax.inject 的 artifact 是可用的。你仅仅需要在 pom.xml 中添加如下的依赖即可: ``` <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> ``` ### 4.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; } // ... } ``` 至于@Autowired,可以在类级别,字段级别,方法级别和构造方法参数级别使用 @Inject。如果你想对应该被注入的依赖使用限定符名称,你应该按如下方式使用@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; } // ... } ``` ### 4.11.2 @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> ``` ### 4.11.3 标准方法的限制 当使用标准注解时,了解一些不可用,但是很重要的特性是必要的,在下面的表格中给 出: 表 4.6 Spring 注解和标准注解的对比 | Spring | javax.inject.* | javax.inject 限制/注释 | | --- | --- | --- | | @Autowired | @Inject | @Inject 没有'required'属性 | | @Component | @Named | | @Scope("singleton") | @Singleton | jsr-330 默认范围和 Spring 的 prototype 相似。但是,要保持和 Spring 一般默认值一致,在 Spring 容器中 jsr-330 的 bean 声 明默认是 singleton 的。要使用另外的 范围,你应该使用 Spring 的@Scope 注解。javax.inject 也提供[@Scope](http://download.oracle.com/javaee/6/api/javax/inject/Scope.html) 注解。不过这仅 仅用于创建你自己的注解。 | | @Qualifier | @Named | | @Value | - | 不等同 | | @Required | - | 不等同 | | @Lazy | - | 不等同 |