如果 @Configuration 类中存在空构造函数,则 Spring @DynamicPropertySource 不起作用

Posted

技术标签:

【中文标题】如果 @Configuration 类中存在空构造函数,则 Spring @DynamicPropertySource 不起作用【英文标题】:Spring @DynamicPropertySource does not work if an empty constructor is present in an @Configuration class 【发布时间】:2021-06-28 03:23:44 【问题描述】:

我使用TestContainers 进行集成测试,我使用@DynamicPropertySource 设置KafkaContainer 引导服务器,如下所示:

@DynamicPropertySource
static void kafkaProperties(DynamicPropertyRegistry registry) 
    registry.add("spring.kafka.bootstrap-servers", () ->  
        return kafkaContainer1.getHost() + ":" + kafkaContainer1.getFirstMappedPort();
    );

这就像一个魅力,即在我的KafkaTopicConfiguration类中:

@Configuration
public class KafkaTopicConfiguration 

    private String bootstrapServers;

    public KafkaTopicConfiguration(@Value("$spring.kafka.bootstrap-servers") String bootstrapServers) 
        this.bootstrapServers = bootstrapServers;
    

其中bootstrapServers会得到Docker暴露在宿主机上的KafkaContainer的地址。 现在,我添加了一个空构造函数,因为我想解决一些问题,如下所示:

public KafkaTopicConfiguration() 
    System.out.println("In KafkaTopicConfiguration constructor");

突然boostrapServers 值变成null。当我删除空构造函数时,它恢复正常。有谁知道为什么?谢谢。

【问题讨论】:

所以你删除了对字段的赋值,发现它是null? @M.Deinum 是什么意思?请解释一下,谢谢! 正如我所说的那样。在构造函数中,您传入一个参数并将其分配给一个字段。您删除它并仍然期望分配发生,这不是事情的运作方式。 嗨@M.Deinum,你误会了。我为故障排除添加的构造函数是这样的:public KafkaTopicConfiguration(). 我没有误会什么。是你不理解事物。您添加了一个没有分配任何内容的构造函数,并想知道为什么字段为空。使用无参数构造函数而不是其他构造函数,因此不会将任何内容分配给该字段。 【参考方案1】:

感谢@M.Deinum 指出我的错误。为了后代,我应该在我现有的构造函数上添加 @Autowired 注释,以告诉 Spring 使用哪个构造函数:

@Autowired
public KafkaTopicConfiguration(@Value("$spring.kafka.bootstrap-servers") String bootstrapServers) 
    this.bootstrapServers = bootstrapServers;

    
public KafkaTopicConfiguration() 
    System.out.println("In KafkaTopicConfiguration constructor");

虽然我的其他构造函数没有用,我应该在现有的 1-arg 构造函数上添加 SysOut ;-)

【讨论】:

以上是关于如果 @Configuration 类中存在空构造函数,则 Spring @DynamicPropertySource 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

1.7Oob 继承关系中构造方法的使用

java学习之面向对象

java-面向对象-构造函数

构造方法

Java构造函数

空指针错误悼念与分析