我正在编写一个使用 spring 的库,供其他人使用。在我的库中,我有一个类 A
,它有一个接口(interface) B
作为字段(使用 @Autowired
)。
我有那个字段的默认实现,但用户可以自己实现自定义实现。我想要发生的事情如下:
如果用户实现了 B
,我希望将该 bean 注入(inject)到 A
,否则我希望注入(inject)我的默认实现。
类似于 @Primary
我知道用户可以添加 @Primary
注释来实现这一点,但我不希望他添加除 @Component
之外的任何其他注释(因为用户不清楚为什么一定要加@Primary
注解)
有没有办法实现这种行为?我也尝试过 @Order
和 @Priority
,但没有成功——用户必须添加另一个注释。
谢谢!
最佳答案
您应该创建 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方法将被使用。
关于java - Spring 默认 bean 候选者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49030379/