Spring multiple beans:除了`@Primary`之外,还有其他优先级注解吗?

c7rzv4ha  于 2024-01-05  发布在  Spring
关注(0)|答案(2)|浏览(129)

我将从解释我的情况开始。我们的应用程序分为共享项目(包含所有项目的代码)和特定应用程序。在共享项目中,我们有一个interface及其实现

  1. public interface Provider
  2. {
  3. ...
  4. }
  5. @Bean
  6. public class ProviderImpl implements Provider
  7. {
  8. ...
  9. }

字符串
在某些应用程序中,我们需要更改默认实现,因此我们定义了另一个Bean

  1. @Bean
  2. @Primary
  3. public class ApplicationProviderImpl implements Provider
  4. {
  5. ...
  6. }


我想消除用@Primary注解每个特定于应用程序的实现的需要,这样其他开发人员就可以尽可能地提供他们的bean实现。
除了@Primary之外,是否还有其他的注解来决定使用哪个bean实现?注解器可能会有所帮助,但在我看来会使它更容易出错。

mzmfm0qo

mzmfm0qo1#

感谢@XtremeBaumer的评论,我得到了一个很好的解决方案:

  1. // in shared project
  2. @Bean
  3. @ConditionalOnMissingBean(Provider.class)
  4. public class ProviderImpl implements Provider
  5. {
  6. ...
  7. }

字符串
这基本上导致了与@Primary相反的结果。

dxpyg8gm

dxpyg8gm2#

由于注解有长度限制,让我把它放在这里,Re:@Mathias“如果有两个bean具有相同的@ConditionalOnMissingBean注解.”
Spring没有提供专门的bean overriding机制,但在注入端支持丰富的bean选择方法。其中之一是ObjectProvider。假设你的Provider接口有3个bean:

  1. @Bean
  2. @Order(10000)
  3. @ConditionalOnMissingBean
  4. public Provider enterpriseProvider() {
  5. return new EnterpiseWideProvider();
  6. }
  7. @Bean
  8. @Order(5000)
  9. @ConditionalOnMissingBean
  10. public Provider productLineProvider() {
  11. return new ProductLineProvider();
  12. }
  13. @Bean
  14. @Order(1000)
  15. public Provider productProvider() {
  16. return new MyProductProvider();
  17. }

字符串
现在在注入端使用ObjectProvider而不是Provider(构造函数注入,ObjectProvider作为参数):

  1. this.provider = objectProvider.orderedStream().findFirst(); // 'productProvider'

展开查看全部

相关问题