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。
我哪里错了?
我也尝试了以下解决方案,均无效:
- 在 MyBean 中插入 @DependsOn
- 评论了 @Component 并将 MyBean 配置为 spring
的 @Bean
我做的最后一个测试(未出现在 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
.
@Component
public class MyBean {
String message;
public MyBean (MyConfigProp myConfigProp) {
this.message = myConfigProp.getMessage ();
}
}
我分享剩下的知识。
详细地,尝试提出的解决方案,结果是:
- 在
MyConfigProp
注释上添加 @Component
stereo-type
在 MyBean
中使用 @Autowired
无效,即使添加 @ComponentScan
。它仍然启动 NullPointerException
- 注释
@EnableConfigurationProperties
似乎只有在以下情况下才有用
@Configuration
未在 MyConfigProp
上使用,无法解决问题
根据测试和文档阅读,如果我理解正确,问题是我尝试在 MyBean
构造函数中使用 @ Autowired
中的对象,并且在创建过程中, Spring
尚未实例化MyConfigProp
,因此NullPointerException
。
我通过添加 solutions
package
和可能的解决方案来更新 code:
MyBeanWorked
:解决方案如上所示。
WithoutConstructor
:通过将指令移动到方法中,
启动成功,应用程序运行。
WorkedWithInjectProp
: 未声明为 @Component
但配置为
@Bean
。稍微长一点,但只需要 属性,也许更干净。
代码中有更多详细信息。
我希望我做了一些愉快的事情。
在配置 class 上使用自动装配时,spring 引导出现问题。 我通过在 github.
上创建一个小的 spring boot project 来最小化问题我创建了 MyBean class 并将其声明为 @Component 并尝试自动装配 MyConf class 声明为 @Configuration(并读取文件 myconfig.properties 中的 属性)。理论上,一切都在spring上下文中,但是当应用程序启动时myConfigPropMyBean中的变量为null。
我哪里错了?
我也尝试了以下解决方案,均无效:
- 在 MyBean 中插入 @DependsOn
- 评论了 @Component 并将 MyBean 配置为 spring 的 @Bean
我做的最后一个测试(未出现在 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
.
@Component
public class MyBean {
String message;
public MyBean (MyConfigProp myConfigProp) {
this.message = myConfigProp.getMessage ();
}
}
我分享剩下的知识。 详细地,尝试提出的解决方案,结果是:
- 在
MyConfigProp
注释上添加@Component
stereo-type
在MyBean
中使用@Autowired
无效,即使添加@ComponentScan
。它仍然启动NullPointerException
- 注释
@EnableConfigurationProperties
似乎只有在以下情况下才有用@Configuration
未在MyConfigProp
上使用,无法解决问题
根据测试和文档阅读,如果我理解正确,问题是我尝试在 MyBean
构造函数中使用 @ Autowired
中的对象,并且在创建过程中, Spring
尚未实例化MyConfigProp
,因此NullPointerException
。
我通过添加 solutions
package
和可能的解决方案来更新 code:
MyBeanWorked
:解决方案如上所示。WithoutConstructor
:通过将指令移动到方法中, 启动成功,应用程序运行。WorkedWithInjectProp
: 未声明为@Component
但配置为@Bean
。稍微长一点,但只需要 属性,也许更干净。
代码中有更多详细信息。 我希望我做了一些愉快的事情。