Spring默认bean候选项

8
我正在编写一个使用Spring的库,供其他人使用。在我的库中,我有一个类A,它有一个接口B作为字段(带有@Autowired注释)。我有一个默认实现的这个字段,但用户可以自己实现一个自定义实现。我想要发生的是以下情况:如果用户实现了B,则将该bean注入A,否则我希望注入我的默认实现。就像@Primary的相反。
我知道用户可以添加@Primary注释以使其发生,但我不希望他除@Component之外添加任何其他注释(因为用户不清楚为什么必须添加@Primary注释)。
是否有一种实现此行为的方法?我也尝试过@Order和@Priority,但没有成功-用户必须添加另一个注释。
谢谢!
2个回答

13

你应该创建自己的自动配置。自动配置类总是最后处理,所以用户的自定义配置将被首先处理,并且使用@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配置类),使其以不同的方式执行几乎是不可能的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接