8.2.6 自动装配和精确装配3 @Qualifier注解

@Qualifier注解

正如上面看到的,@Autowired总是采用byType的自动装配策略,在这种策略下,符合自动装配类型的候选Bean实例常常有多个,这个时候就可能引起异常(对于数组类型参数、集合类型参数则不会)。
为了实现精确的自动装配, Spring提供了@Qualifier注解,通过使用 @Qualifier,允许根据Beanid来执行自动装配
使用@Qualifier注解的意义并不大,如果程序使用@Autowired@Qualifier实现精确的自动装配,还不如直接使用@Resource注解执行依赖注入。

@Qualifier修饰实例变量

@Qualifier通常可用于修饰实例变量,如下面的代码所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Component
public class Chinese implements Person
{
@Autowired
@Qualifier("steelAxe")
private Axe axe;
// // axe的setter方法
// @Autowired
// public void setAxe(@Qualifier("stoneAxe") Axe axe)
// {
// this.axe = axe;
// }
// 实现Person接口的useAxe()方法
public void useAxe()
{
// 调用axe的chop()方法,
// 表明Person对象依赖于axe对象
System.out.println(axe.chop());
}
}

上面的程序中指定了axe实例变量将使用自动装配,且精确指定了被装配的Bean实例名称是steelAxe,这意味着Spring将会搜索容器中名为steelAxeAxe实例,并将该实例设为该axe实例变量的值。

@Qualifier修饰方法的形式参数

除此之外, Spring还允许使用@Qualifier标注方法的形参,如下面的代码所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Component
public class Chinese implements Person
{
// @Autowired
// @Qualifier("steelAxe")
private Axe axe;
// axe的setter方法
@Autowired
public void setAxe(@Qualifier("stoneAxe") Axe axe)
{
this.axe = axe;
}
// 实现Person接口的useAxe()方法
public void useAxe()
{
// 调用axe的chop()方法,
// 表明Person对象依赖于axe对象
System.out.println(axe.chop());
}
}

上面代码中的粗体字注解指明Spring应该搜索容器中idsteelAxeAxe实例,并将该实例作为setAxe()方法的参数传入。