我有一个带有以下服务的java spring项目:
@Slf4j
public class DialogFlowService {
private String projectId;
private String sessionId;
private String languageCode;
public DialogFlowService(DialogFlowConfig dialogFlowConfig) {
log.info("aaa" + dialogFlowConfig.languageCode);
this.projectId = dialogFlowConfig.projectId;
this.sessionId = dialogFlowConfig.sessionId;
this.languageCode = dialogFlowConfig.languageCode;
}
}
构造函数将以下类作为参数:
@Configuration
@ConfigurationProperties(prefix = "dialog-flow")
public class DialogFlowConfig {
@NotNull
public String projectId;
@NotNull
public String sessionId;
@NotNull
public String languageCode;
}
理论上,这应该由以下bean实例化:
@Bean
public DialogFlowService dialogFlowService() {
return new DialogFlowService(new DialogFlowConfig());
}
但是实际上,当我尝试记录构造函数参数之一时,它显示为null。我想念什么吗?
这类似于此处描述的内容:Why is my Spring @Autowired field null?
本质上,通过亲自实例化DialogFlowConfig
实例并且不移交给Spring,您可以防止Spring对它进行后处理并注入ConfigurationProperties
属性值。
相反,为@Bean
创建一个DialogFlowConfig
方法,并使用相应的Spring bean创建您的DialogFlowService
。例如
@Bean
public DialogFlowService dialogFlowService(DialogFlowConfig dialogFlowConfig) {
return new DialogFlowService(dialogFlowConfig);
}
@Bean
public DialogFlowConfig dialogFlowConfig() {
return new DialogFlowConfig();
}
Spring将使用带有@Bean
注释的dialogFlowConfig()
工厂bean方法来实例化和处理相应的实例(设置其字段)。然后它将与dialogFlowService()
工厂方法一起使用。