Spring Boot 2.7升级3.0.7后@ConfigurationProperties注入失败
Spring Boot 3.0升级后@ConfigurationProperties依赖注入问题解决
问题原因
Spring Boot 3.0对@ConfigurationProperties类的实例化机制做了调整:这类类默认采用构造方法绑定配置属性,不再参与常规的Spring依赖注入流程。因此你无法直接在它的构造方法或字段中注入其他Spring管理的Bean(比如ConfigRepository),这就是升级后构造参数为null的根本原因。
可行调整方案
方案一:将Properties类注册为Bean并依赖注入
给ConnectorProperties添加@Component注解,将其纳入Spring Bean管理,再通过@Autowired注入ConfigRepository:
@Component @ConfigurationProperties(ConnectorProperties.PREFIX) public class ConnectorProperties { static final String PREFIX = "connector"; @Autowired private ConfigRepository configRepository; // 移除原带参构造,保留无参构造 public ConnectorProperties() {} private long gracefulShutdownPeriod = 60; // 替换@Value,用默认值实现配置绑定 public List<String> getPartners() { return configRepository.getPartners(); } public void setGracefulShutdownPeriod(long gracefulShutdownPeriod) { this.gracefulShutdownPeriod = gracefulShutdownPeriod; } public long getGracefulShutdownPeriod() { return gracefulShutdownPeriod; } }
注:这里把@Value换成了字段默认值,更符合@ConfigurationProperties的配置绑定规范,配置项会自动读取connector.graceful-shutdown-period的值。
方案二:通过配置类手动构建Properties Bean(推荐)
创建独立配置类,注入ConfigRepository后手动构建ConnectorProperties实例,明确分离配置绑定与依赖注入逻辑:
首先修改ConnectorProperties,添加ConfigRepository的setter方法:
@ConfigurationProperties(ConnectorProperties.PREFIX) public class ConnectorProperties { static final String PREFIX = "connector"; private ConfigRepository configRepository; private long gracefulShutdownPeriod = 60; public ConnectorProperties() {} public void setConfigRepository(ConfigRepository configRepository) { this.configRepository = configRepository; } public List<String> getPartners() { return configRepository.getPartners(); } public void setGracefulShutdownPeriod(long gracefulShutdownPeriod) { this.gracefulShutdownPeriod = gracefulShutdownPeriod; } public long getGracefulShutdownPeriod() { return gracefulShutdownPeriod; } }
然后创建配置类:
@Configuration @EnableConfigurationProperties public class ConnectorConfig { @Bean @ConfigurationProperties(ConnectorProperties.PREFIX) public ConnectorProperties connectorProperties(ConfigRepository configRepository) { ConnectorProperties properties = new ConnectorProperties(); properties.setConfigRepository(configRepository); return properties; } }
内容的提问来源于stack exchange,提问作者tgillain
相关产品推荐
相关产品推荐

