我正在编写一个使用spring的库,供其他人使用。在我的图书馆中,我的课程A
有一个界面B
作为字段(@Autowired
)。
我有该字段的默认实现,但用户可以自己实现自定义实现。我想要发生的是以下内容:
如果用户实现了B
,我希望将该bean注入A
,否则我希望注入我的默认实现。
与@Primary
我知道用户可以添加@Primary
注释以便发生这种情况,但我不希望他在@Component
之外添加任何其他注释(因为它不清楚用户为什么必须添加@Primary
注释)
有没有办法实现这种行为?我还尝试了@Order
和@Priority
,但没有运气 - 用户必须添加其他注释。
谢谢!
答案 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配置类)的情况下使其执行不同是非常不可能的。