8.2.6 自动装配和精确装配2 @Primary注解

@Primary注解

Spring提供了一个@Primary注解,该注解用于将指定的候选Bean设置为主候选者Bean

程序示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
E:\workspace_QingLiangJiJavaEEQiYeYingYongShiZhang5\Primary
└─src\
├─beans.xml
├─lee\
│ └─SpringTest.java
└─org\
└─crazyit\
└─app\
└─service\
├─Dog.java
├─impl\
│ ├─Chinese.java
│ ├─GunDog.java
│ └─PetDog.java
└─Person.java

例如如下Chinese类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Component
public class Chinese implements Person
{
private Dog dog;
@Autowired
public void setGunDog(Dog dog)
{
this.dog = dog;
}
public void test()
{
System.out.println("我是一个普通人,养了一条狗:" + dog.run());
}
}

上面Chinese类使用@Autowired修饰了setGunDog(Dog dog)方法,这意味着Spring会从容器中寻找类型为DogBean来完成依赖注入,如果容器中有两个类型为DogBean, Spring容器就会引发异常。
此时可通过@Primary注解修饰特定Bean类,将它设置为主候选者,这样Spring将会直接注入有@Primary修饰的Bean,不会理会其他符合类型的Bean。例如如下PetDog类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Component
@Primary
public class PetDog implements Dog
{
@Value("小花")
private String name;
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public String run()
{
return "我是一只叫" + getName() + "的宠物狗,只能慢慢地跑...";
}
}

上面程序使用@Primary修饰了PetDog类,因此该Bean将会作为主候选者Bean,所以Spring将会把该Bean作为参数注入所有需要Dog实例的setter方法、构造器中。