Spring上下文:连接bean——从Spring上下文中的多个bean中进行选择

221 阅读1分钟

当Spring需要向参数或类字段注入值,但有多个相同类型的bean可供选择。假设您在Spring上下文中有三个Parrot bean。您可以将Spring配置为将Parrot值类型注入到参数中.

1.参数的标识符与上下文中的一个bean的名称相匹配

(请记住,该名称与使用@Bean注释的返 回其值的方法的名称相同)。在本例中,Spring将选择名称与参数相同的bean。

@Configuration
public class ProjectConfig { 
@Bean
public Parrot parrot1() { 
Parrot p = new Parrot();
p.setName("Koko"); 
return p; 
} 

@Bean
public Parrot parrot2() {
Parrot p = new Parrot();
p.setName("Miki"); 
return p; 
}

@Bean
public Person person(Parrot parrot2) {
Person p = new Person(); 
p.setName("Ella"); 
//参数的名称与表示鹦鹉Miki的bean的名称相匹配。
p.setParrot(parrot2); 
return p;
}
}

小结: 当上下文包含多个相同类型的实例时,指示Spring从其上下文为您提供特定实例 的一种方法是依赖该实例的名称。只需将该参数命名为与您希望Spring为您提供的实例相同的名称即可。 在实际场景中,我倾向于避免依赖参数名称,因为参数名称很容易被其他开发人员重构和错误更改。

2.使用@Qualifier注释显式选择特定的bean

@Configuration
public class ProjectConfig { 
@Bean
public Parrot parrot1() { 
Parrot p = new Parrot();
p.setName("Koko"); 
return p; 
} 

@Bean
public Parrot parrot2() {
Parrot p = new Parrot();
p.setName("Miki"); 
return p; 
}

@Bean
//使用@Qualifier注释的value属性指定了想要注入的bean
public Person person(@Qualifier("parrot2") Parrot parrot) {
Person p = new Person(); 
p.setName("Ella"); 

//@Qualifier注释,可以清楚地标记从上下文注入特定bean
p.setParrot(parrot); 
return p;
}
}

参考书籍
Spring start here(manning.com)