我正在写一个使用spring的库,供其他人使用。在我的库中,我有类A
,它有一个接口B
作为一个字段(与@Autowired
)。我有该字段的默认实现,但用户可以自己实现自定义实现。我想要发生的是以下内容:如果用户实现了B
,我希望将该bean注入A
,否则我希望我的默认实现被注入。像@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。
我不相信。 Spring的@Autowired非常具体。在没有任何配置更改(XML或Spring配置类)的情况下使其执行不同是非常不可能的。