我不知道@Primary
解决了什么问题。
文档说:
指示当多个时应优先考虑Bean 候选人有资格自动装配单值依赖项。如果 候选者之间确实存在一个“主要” bean,它将是 自动接线的值。
示例代码:
@Configuration
class Configuration {
@Bean
@Primary
MyType bean1() {
return new MyType(1);
}
@Bean
MyType bean2() {
return new MyType(2);
}
}
示例:我有2个bean bean1
和bean2
返回类型为MyType
的对象。其中bean1
的注解为@Primary
,因此当我将MyType
类型的对象注入某个构造函数时,将注入bean1
创建的对象。
那么如果要注入主bean,为什么我要有两个相同类型的bean?什么意思我什么时候以及如何使用未标注为主要的bean2
?示例显示bean2
是多余的且未使用。
答案 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。