如何正确实现从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; } }
额外注意事项
- 启用配置绑定:确保Spring Boot启动类上添加了
@EnableConfigurationProperties注解(若Config类未被@ComponentScan自动扫描到),或直接指定绑定类:@EnableConfigurationProperties(Config.class)。 - 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
相关产品推荐
相关产品推荐

