Spring默认bean候选者

时间:2018-02-28 13:09:30

标签: java spring spring-boot spring-bean

我正在编写一个使用spring的库,供其他人使用。在我的图书馆中,我的课程A有一个界面B作为字段(@Autowired)。 我有该字段的默认实现,但用户可以自己实现自定义实现。我想要发生的是以下内容: 如果用户实现了B,我希望将该bean注入A,否则我希望注入我的默认实现。 与@Primary

相反的东西

我知道用户可以添加@Primary注释以便发生这种情况,但我不希望他在@Component之外添加任何其他注释(因为它不清楚用户为什么必须添加@Primary注释)

有没有办法实现这种行为?我还尝试了@Order@Priority,但没有运气 - 用户必须添加其他注释。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

@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,则将使用它

答案 1 :(得分:0)

我不相信。 Spring的 @Autowired 非常具体。在没有任何配置更改(XML或Spring配置类)的情况下使其执行不同是非常不可能的。