如果存在@Primary bean,为什么还要创建另一个bean?

use*_*ser 6 java spring spring-boot

我不明白什么问题@Primary可以解决。

该文件说:

[@Primary]指示当多个候选者有资格自动装配单值依赖项时,应优先考虑Bean。如果候选对象中仅存在一个“主” bean,它将是自动装配的值。

示例代码:

@Configuration
class Configuration {
   @Bean
   @Primary
   MyType bean1() {
       return new MyType(1);
   }

   @Bean
   MyType bean2() {
       return new MyType(2);
   }
}
Run Code Online (Sandbox Code Playgroud)

范例

我有2个bean,bean1并且bean2都带有type MyTypebean1具有@Primary注释,因此当我将类型的对象自动装配MyType到某些构造函数时,bean1将被选择。

如果总是选择主bean,为什么有两个相同类型的bean有用吗?我何时以及如何使用bean2未标注为主要的?该示例显示了bean2冗余且未使用。

Mic*_*ael 7

您仍然可以始终限定您真正想要的 bean,这意味着不会总是选择主要的 bean。

@Component
class MyComponent
{
    public MyComponent(@Qualifier("bean2") MyType foo) { /*...*/ } 
}
Run Code Online (Sandbox Code Playgroud)

@Primary如果有两个或更多可能的候选者,只是告诉 Spring 优先考虑哪个 bean。你总是可以明确的。

此外,另一个构造函数可能采用所有MyTypes的列表。在这种情况下,两个 bean 都会自动装配。

@Component
class AnotherComponent
{
    public AnotherComponent(List<MyType> allFoos) { /*...*/ } 
}
Run Code Online (Sandbox Code Playgroud)