繁体   English   中英

Spring bean 没有被捡起?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM