Spring 引导 - @Configuration class 在 spring 组件中为空

Spring Boot - @Configuration class is null in spring component

在配置 class 上使用自动装配时,spring 引导出现问题。 我通过在 github.

上创建一个小的 spring boot project 来最小化问题

我创建了 MyBean class 并将其声明为 @Component 并尝试自动装配 MyConf class 声明为 @Configuration(并读取文件 myconfig.properties 中的 属性)。理论上,一切都在spring上下文中,但是当应用程序启动时myConfigPropMyBean中的变量为null。

我哪里错了?

我也尝试了以下解决方案,均无效:

我做的最后一个测试(未出现在 github 项目中)是将 MyConfigProp 作为参数传递给 MyBean 构造函数,并且成功了。

@Component
public class MyBean {

    String message;

    public MyBean(MyConfigProp myConfigProp) {
        this.message = myConfigProp.getMessage();
    }

}

有点懵

看起来您没有将 MyConfigProp 自动装配到 MyBean 中:

@Component
public class MyBean {

String message;

    @Autowired
    public MyBean(MyConfigProp myConfigProp) {
        this.message = myConfigProp.getMessage();
    }

}

您需要在 MyBean class 中添加 @EnableConfigurationProperties(MyConfigProp.class),使其看起来像:

MyBean.java

@Component
@EnableConfigurationProperties(MyConfigProp.class)
public class MyBean {

String message;

    @Autowired
    public MyBean(MyConfigProp myConfigProp) {
        this.message = myConfigProp.getMessage();
    }

}

MyConfigProp.java

@PropertySource("classpath:myconfig.properties")
@ConfigurationProperties(prefix = "config")
public class MyConfigProp {

    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

我尝试了所有解决方案,唯一真正解决问题的方法是将 MyConfigProp 作为参数传递给 MyBean 构造函数,从 post 开始,即使没有 @Autowired.

Code update

@Component
public class MyBean {

  String message;

  public MyBean (MyConfigProp myConfigProp) {
     this.message = myConfigProp.getMessage ();
  }
}

我分享剩下的知识。 详细地,尝试提出的解决方案,结果是:

  • MyConfigProp 注释上添加 @Component stereo-typeMyBean 中使用 @Autowired 无效,即使添加 @ComponentScan。它仍然启动 NullPointerException
  • 注释@EnableConfigurationProperties似乎只有在以下情况下才有用 @Configuration 未在 MyConfigProp 上使用,无法解决问题

根据测试和文档阅读,如果我理解正确,问题是我尝试在 MyBean 构造函数中使用 @ Autowired 中的对象,并且在创建过程中, Spring 尚未实例化MyConfigProp,因此NullPointerException。 我通过添加 solutions package 和可能的解决方案来更新 code

  • MyBeanWorked:解决方案如上所示。
  • WithoutConstructor:通过将指令移动到方法中, 启动成功,应用程序运行。
  • WorkedWithInjectProp: 未声明为 @Component 但配置为 @Bean。稍微长一点,但只需要 属性,也许更干净。

代码中有更多详细信息。 我希望我做了一些愉快的事情。