依赖注入是 Spring 框架的基石,使开发人员能够创建松耦合、可测试的应用程序。然而,当 Spring 的依赖注入机制遇到相同类型的多个 bean 时,常常会出现 NoUniqueBeanDefinitionException
的常见挑战。本文深入探讨 Spring 如何解决此类 autowiring 冲突,重点关注 @Primary
和 bean 名称匹配的作用,并结合框架的内部逻辑进行分析,澄清关于 @Priority
的误解。
常见的困境
假设你有一个组件 A,需要一个类型为 B 的 bean:
@Component
public class A {
@Autowired
private B b;
}
在配置中,定义了两个类型为 B 的 bean:
@Configuration
@ComponentScan
public class JavaConfig {
@Bean("b1")
B b1() {
return new B();
}
@Bean("b2")
B b2() {
return new B();
}
}
启动应用程序时,Spring 的依赖注入机制会感到困惑。它知道需要一个 B,但找到了两个(b1 和 b2),导致歧义,抛出以下异常:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: 没有可用的类型 'B' 的 bean:预期单个匹配的 bean,但找到 2 个:b1,b2
经验丰富的开发人员知道有几种方法可以解决这个问题:
@Qualifier("b