Spring 默认候选 bean

Spring default bean candidate

我正在编写一个使用 spring 的库,供其他人使用。在我的图书馆中,我有 class A,它有一个接口 B 作为字段(带有 @Autowired)。 我有那个字段的默认实现,但用户可以自己实现自定义实现。我想要发生的事情如下: 如果用户实现了 B,我希望将该 bean 注入到 A,否则我希望注入我的默认实现。 类似于 @Primary

的反义词

我知道用户可以添加 @Primary 注释来实现这一点,但我不希望他添加除 @Component 之外的任何其他注释(因为不清楚对于用户为什么他必须添加 @Primary 注释)

有没有办法实现这种行为?我也试过 @Order@Priority,但没有成功——用户必须添加另一个注释。

谢谢!

我不这么认为。 Spring 的 @Autowired 相当具体。在不更改任何配置(XML 或 Spring 配置 class)的情况下使其表现不同几乎是不可能的。

您应该创建 your own auto configuration。自动配置 classes 总是最后处理,因此首先处理用户自己的配置,并且在使用 @Conditional... 注释时,用户的 bean 将优先。

您的自动配置 class 应如下所示:

@Configuration
public class MyAutoConfiguration {

  @ConditionalOnMissingBean(B.class)
  @Bean
  public B defaultImplementation() { return A(); }

  @Bean
  public UsesB classThatUsesB(B b) { return UsesB(b); }

}

在这种情况下,如果您的库的用户定义了一个 B 类型的 bean,它将始终首先被使用,如果他们没有定义,则将使用 defaultImplementation 方法创建的 bean .