Spring @Primary-如果primary存在,为什么还要创建其他bean

时间:2018-11-26 14:45:13

标签: java spring spring-boot spring-config

我不知道@Primary解决了什么问题。
文档说:

  

指示当多个时应优先考虑Bean   候选人有资格自动装配单值依赖项。如果   候选者之间确实存在一个“主要” bean,它将是   自动接线的值。

示例代码:

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

   @Bean
   MyType bean2() {
       return new MyType(2);
   }
}

示例:我有2个bean bean1bean2返回类型为MyType的对象。其中bean1的注解为@Primary,因此当我将MyType类型的对象注入某个构造函数时,将注入bean1创建的对象。

那么如果要注入主bean,为什么我要有两个相同类型的bean?什么意思我什么时候以及如何使用未标注为主要的bean2?示例显示bean2是多余的且未使用。

4 个答案:

答案 0 :(得分:2)

您仍然可以始终限定实际需要的bean,这意味着将不会总是选择主要的bean。

@Component
class MyComponent
{
    public MyComponent(@Qualifier("bean2") MyType foo) { /*...*/ } 
}

@Primary只是告诉Spring如果自动连接字段有两个或更多可能的候选对象,则选择哪个bean。

答案 1 :(得分:1)

假设您有多个bean实例,它们之间有一些差异。在许多情况下(例如> 90%),您将需要其中之一,而很少使用其他方法。在这种情况下,将最常用的注解标记为@Primary是有意义的,这样,当没有提供进一步的说明时,它将直接由框架注入。在另一种情况下,您将使用@Qualifier批注指定要使用的确切bean。

一个示例可能是初始化RestTemplate的bean,例如,您将定义一个具有通用设置且将在所有应用程序中使用的全局bean,而另一个将具有一些特定的重试策略以供一小部分使用-情况。

答案 2 :(得分:1)

  

那么如果要注入主bean,为什么我要有两个相同类型的bean?

实际上,如果您未指定要注入哪个豆,而仅使用{strong> primary,则只会注入@Primary 指定未指定类型时将注入哪个bean 。

要回答您的问题,拥有两个相同类型的bean是提供不同实现的一种常见方式,在许多情况下,当我们要使用同一bean的两个bean时,最常见的情况是我们想要为同一应用程序指定两个数据源。

要指定我们要使用哪个bean,我们使用@Resource注释,如下所示:

@Resource(name="bean2")
MyType bean;

有关更多详细信息,您可以检查 @Resource and @Autowired 之间的讨论差异。

答案 3 :(得分:0)

@Primary的一种可能用法是,您可以通过在其中设置@Primary来覆盖测试中的Bean。在运行应用程序时,仍会使用辅助Bean。