【问题标题】:How to extend default bean annotated with @ConditionalOnMissingBean?如何扩展使用@ConditionalOnMissingBean 注释的默认bean?
【发布时间】:2019-09-10 22:25:39
【问题描述】:

我查看了this question 以了解“默认”bean 在 Spring 中是如何实现的。我的项目的父模块中有一个 bean,用 @ConditionalOnMissingBean 注释。我想采用这个 bean 并扩展它的功能,而不是返回一个全新的实例。示例

// in parent module

@Bean
@ConditionalOnMissingBean
Foo defaultBean() {
    Foo foo = new Foo();
    foo.a = 1;
    return foo;
}

// in sub module

@Bean
Foo customBean() {
    Foo foo = /* get reference to defaultBean */;
    foo.a += 1;
    return foo;
}

// In another class

@Autowired
Foo foo;

// foo.a would return 2

为了实现自定义 bean,我如何获得对默认 bean 的引用?

【问题讨论】:

    标签: java spring javabeans autowired spring-ioc


    【解决方案1】:

    在我提供答案之前,我想说我不确定您的方法是否符合您的要求。这样您还可以更新 defaultBean 属性。

    但是对于你的问题: 如果您有多个来自同一类型和 can't find out which implementation you want 的 bean,spring 将采用稍后为自动装配而初始化的那个。为确保您可以在自定义 bean 中使用默认 bean,您必须使用准确的名称自动装配它:

    @Autowired
    Foo defaultBean;
    
    @Bean
    Foo customBean() {
        Foo foo = this.defaultBean;
        foo.a += 1;
        return foo;
    }
    

    如您所见,自动装配的 bean 具有在 @Bean 创建中声明的确切名称。现在在任何你想使用你需要使用的 customBean 的地方:

    @Autowired
    Foo customBean;
    

    【讨论】:

      【解决方案2】:

      由于默认情况下,Spring Bean 是单例的,因此您在 bean 上的任何位置所做的更改都会随处可见。

      要将其保持在应有的位置(在配置类内部),您可以在配置类构造函数中自动装配默认 bean 并进行所需的更改。

      例子:

      @Configuration
      public class MyBeanConfiguration {
          @Autowired
          public MyBeanConfiguration(MyBean bean) {
              // change bean as you wish
         }
      }
      

      【讨论】:

      • 不过就是这样,我希望更改在任何地方都可见。 Foo 在父模块中用作依赖项,我想将自己的依赖项注入到扩展 Foo 功能的父模块中。我该怎么办?
      • 所有配置类(和 XML 文件)都被考虑在内。只要它们被扫描/导入,它们被放置在哪里(在父 ou 子模块中)并不重要。
      猜你喜欢
      • 2014-03-12
      • 2014-11-08
      • 2015-04-28
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-13
      • 1970-01-01
      相关资源
      最近更新 更多