## 4.11 使用 JSR 330 標準注解
從 Spring 3.0 開始,Spring 提供了對 JSR-330 標準注解(依賴注入)的支持。這些注解可 以和 Spring 注解以相同方式被掃描到。你僅僅需要在類路徑下添加相關的 jar 包即可。
> 
> 注意
> 如 果 你 使 用 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 | - | 不等同 |
- 第一部分 Spring framework 概述
- 第 1 章 Spring Framework 介紹
- 1.1 依賴注入和控制反轉
- 1.2 模塊
- 1.3 使用方案
- 第二部分 Spring 3 的新特性
- 第 2 章 Spring 3.0 的新特性和增強
- 2.1 Java 5
- 2.2 改進的文檔
- 2.3 新的文章和教程
- 2.4 新的模塊組織方式和系統構建方式
- 2.5 新特性概述
- 第 3 章 Spring 3.1 的新特性和增強
- 3.1 新特性概述
- 第三部分 核心技術
- 第 4 章 IoC 容器
- 4.1 Spring IoC 容器和 bean 的介紹
- 4.2 容器概述
- 4.3 Bean 概述
- 4.4 依賴
- 4.5 Bean 的范圍
- 4.6 自定義 bean 的性質
- 4.7 Bean 定義的繼承
- 4.8 容器擴展點
- 4.9 基于注解的容器配置
- 4.10 類路徑掃描和管理的組件
- 4.11 使用 JSR 330 標準注解
- 4.12 基于 Java 的容器配置