如何在超级抽象类中使用@Bean?

时间:2018-05-22 08:36:43

标签: java spring spring-boot

我想在超级@Bean中声明abstract class,以防止为每个子类声明它。

考虑这个类层次结构:

@Configuration
public class Config {
  public static abstract class A {
    @Bean
    public myBean() {
      return new MyBean();
    }
  }
  public static class B extends A {
    // Some stuff here
  }
  public static class C extends A {
    // Some other stuff here
  }
}

我无法在Spring Boot 1.5.9(Spring Framework 4.3.13)中执行此操作。

它抛出:

org.springframework.beans.BeanInstantiationException: Failed to instantiate foo.bar.A: Is it an abstract class?

有没有办法防止每个子类重复@Bean

1 个答案:

答案 0 :(得分:0)

目前,您的问题不是重复的bean。问题是 class A未对@Configuration进行注释。如果你添加它,它将开始没有问题。

以下是配置类的规范。 The Spring's @Configuration documentation州 -

  • 必须以类的形式提供配置类(即不是从工厂方法返回的实例),允许通过生成的子类进行运行时增强。
  • 配置类必须是非最终的。
  • 配置类必须是非本地的(即可能不在方法中声明)。
  • 必须将任何嵌套配置类声明为static。
  • @Bean方法可能不会再创建更多配置类(任何此类实例都将被视为常规bean,其配置注释仍未被检测到。)

关于重复的豆类

只会创建一个Bean。 bean定义只会加载并创建一次:)