You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确实现从application.yml注入属性的Spring Bean?(注入失败求助)

解决方案

问题分析

你的配置类存在核心问题导致属性无法注入:@ConfigurationProperties 绑定配置时,需要类中的属性提供公共的getter和setter方法,Spring通过这些方法完成属性注入,你的Config类仅定义了字段,缺少对应的getter/setter,导致address和port始终为默认值。

修正后的代码

方式1:手动添加getter/setter方法

@Configuration
@ConfigurationProperties(prefix = "client")
public class Config {
    private int port;
    private String address;

    // 必须添加getter和setter,Spring依赖这些方法注入配置
    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Bean
    public Client getClient() {
        Client client = new Client();
        client.setPortAddress(address, port);
        return client;
    }
}

方式2:用Lombok简化代码(可选)

如果项目引入了Lombok依赖,可通过@Data注解自动生成getter/setter,减少冗余代码:

@Configuration
@ConfigurationProperties(prefix = "client")
@Data // Lombok自动生成getter、setter等方法
public class Config {
    private int port;
    private String address;

    @Bean
    public Client getClient() {
        Client client = new Client();
        client.setPortAddress(address, port);
        return client;
    }
}

额外注意事项

  1. 启用配置绑定:确保Spring Boot启动类上添加了@EnableConfigurationProperties注解(若Config类未被@ComponentScan自动扫描到),或直接指定绑定类:@EnableConfigurationProperties(Config.class)。
  2. Client类final字段的特殊处理:你的Client类中port和address是final字段,常规set方法无法修改此类字段。如果setPortAddress方法未通过反射等特殊手段生效,需确认Client类是否提供带参数的构造器,改用构造器初始化:
    @Bean
    public Client getClient() {
        // 假设Client存在构造器:public Client(String address, int port)
        return new Client(address, port);
    }
    

内容的提问来源于stack exchange,提问作者Tim Long

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 10:30:50