Spring默认bean候选者

问题描述 投票:0回答:2

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

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

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

谢谢!

java spring spring-boot spring-bean
2个回答
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。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.