@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
会从容器中寻找类型为Dog
的Bean
来完成依赖注入,如果容器中有两个类型为Dog
的Bean, 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
方法、构造器中。
原文链接: 8.2.6 自动装配和精确装配2 @Primary注解