![](/img/trans.png)
[英]@PropertySource on a bean not picked up by Spring in JavaConfig
[英]Spring bean not being picked up?
我有一个具有以下服务的 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;
}
}
构造函数将以下 class 作为参数:
@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());
}
但是在实践中,当我尝试记录其中一个构造函数 arguments 时,它会显示为 null。 我错过了什么吗?
我认为像这样更改您的第三个代码片段可以解决问题。
@Bean
public DialogFlowService dialogFlowService(DialogFlowConfig dialogFlowConfig) {
return new DialogFlowService(dialogFlowConfig);
}
DialogFlowConfig
class 已标记为@Configuration
。 因此,它由 Spring 应用程序上下文管理。 因此,您不必使用 new 关键字显式创建 object。 您可以将其作为参数
尝试将@EnableConfigurationProperties(DialogFlowConfig.class)
放入您的 Spring 应用程序 class。
这类似于此处描述的内容: 为什么我的 Spring @Autowired 字段 null?
本质上,通过自己实例化DialogFlowConfig
实例而不将其移交给 Spring,您可以防止 Spring 对其进行后处理并注入ConfigurationProperties
属性值。
而是为DialogFlowConfig
创建一个@Bean
方法并使用相应的 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()
工厂方法一起使用。
注意:如果你这样做,你需要从DialogFlowConfig
中删除@Configuration
注释,假设你之前是组件扫描它。 或者,如果您正确扫描组件,您甚至不需要我建议的附加@Bean
注释dialogFlowConfig()
工厂方法。 只需在dialogFlowService
方法中注入由其@Configuration
注释声明的DialogFlowConfig
bean。
首先,您需要在 DialogFlowConfig 中使用 setter getter 或在所有属性上使用 @Value 注释。 您还需要使用 @Service 构造型注释您的服务 class DialogFlowService
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.