Spring 中的 Bean 有多个实现类,该怎么指定注入?
在Spring中,当一个接口有多个实现类时,Spring默认会按类型进行自动装配。如果有多个相同类型的Bean(也就是多个实现了同一接口的Bean),Spring将会抛出NoUniqueBeanDefinitionException
异常,因为它无法确定应该注入哪个Bean。
解决这个问题的一种方式是使用@Primary
注解。你可以在你想要优先注入的Bean上添加@Primary
注解:
@Service
@Primary
public class PrimaryService implements ServiceInterface {
//...
}
@Service
public class SecondaryService implements ServiceInterface {
//...
}
在这个例子中,如果我们在其他地方进行ServiceInterface
类型的自动装配,Spring将会注入PrimaryService
,因为它被标注了@Primary
注解。
另一种方式是使用@Qualifier
注解,如前面所述,这个注解可以用来消除自动装配的歧义:
public class SomeClientClass {
private ServiceInterface service;
@Autowired
@Qualifier("secondaryService")
public void setService(ServiceInterface service) {
this.service = service;
}
//...
}
在这个例子中,我们在setService
方法上使用了@Autowired
和@Qualifier("secondaryService")
注解。Spring将会注入名称为secondaryService
的ServiceInterface
实现,而不是其他的实现。这样,我们就可以很精确地控制哪个Bean被注入。