【问题标题】:Using @Value in spring beans at initialization在初始化时在 spring bean 中使用 @Value
【发布时间】:2023-02-02 20:37:16
【问题描述】:

我需要从 application.properties 文件提供超时,但在初始化时失败,因为尚未加载属性。加载它们的最佳做法是什么?

@Configuration
@AllArgsConstructor
@Slf4j
public class Config {

    @Value("${connectionTimeout}") 
    int connectionTimeout;
    @Value("${responseTimeout}") 
    int responseTimeout;

    @Bean
    public ClientHttpConnector getConnector() {
        HttpClient client = HttpClient.create();

        client.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connectionTimeout)
                .responseTimeout(Duration.ofMillis(responseTimeout));

        return new ReactorClientHttpConnector(client);

    }
    @Bean
    public WebClient webClient() {
        return WebClient.builder().defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE)
                .clientConnector(getConnector())
                .build();
    }

正如其他类似帖子中所建议的,我尝试使用@ConfigurationProperties,但这根本不起作用。有没有一些我不知道的更简单的方法来加载它们?

【问题讨论】:

  • 您可以尝试将这些值作为 Bean 方法参数传递:public ClientHttpConnector getConnector(@Value("${connectionTimeout}") int connectionTimeout, @Value("${responseTimeout}") int responseTimeout) { .. }
  • 当我在这之后创建 WebClient 时,我传递给 getConnector() 的值是什么,因为它现在需要这两个参数?
  • 还将相同的值传递给您的webClient() bean,然后将它们传递给getConnector()

标签: java spring spring-boot dependency-injection


【解决方案1】:

尝试通过构造函数注入值:

public Config(@Value("${connectionTimeout}") int connectionTimeout,
              @Value("${responseTimeout}") int responseTimeout) {
    // assign to fields
}

【讨论】: