java - 如何在 super 抽象类中使用@Bean?

标签 java spring spring-boot

我想在 super 抽象类中声明@Bean,以防止为每个子类声明它。

考虑这个类层次结构:

@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:无法实例化 foo.bar.A:它是抽象类吗?

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

最佳答案

目前,您的问题不是重复的 beans。问题是 class A 未使用 @Configuration 进行注释。如果添加它,它将毫无问题地启动。

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

  • 配置类必须作为类提供(即不是作为从工厂方法返回的实例),以便通过生成的子类实现运行时增强。
  • 配置类必须是非最终的。
  • 配置类必须是非本地的(即不能在方法内声明)。
  • 任何嵌套配置类都必须声明为静态。
  • @Bean 方法可能不会依次创建更多配置类(任何此类实例都将被视为常规 Bean,其配置注释不会被检测到)。
<小时/>

关于重复的 Bean

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

<小时/>

关于java - 如何在 super 抽象类中使用@Bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50463262/

相关文章:

java - 方向改变时 Activity 不断重启

java - 为什么 Spring Boot hibernate OneToMany 映射子项返回 null 值?

spring - 如何模拟 Spring Data 和单元测试服务

spring - SpringBoot 1.5.* 上的执行器日志文件不起作用。 HTTP 404

java - 无法在组件中注入(inject) bean

java - 如何通过 Activity 传递 List<自定义对象>

java.lang.ClassCastException : java. lang.String 无法转换为 java.lang.Boolean,使用 Table.addRow() 和 Jackcess

java - 标点符号保存在词袋中吗?

java - 在STS中使用带有spring boot的jaxb2 maven插件时收到错误

java - pom.xml 和事务中包含 spring-boot-starter-data-jpa 和 spring-tx 的旧版 spring boot 项目?