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

Spring Boot中@ConfigurationProperties与原型作用域行为异常问题

问题分析与解决方案

核心问题原因

  1. @RefreshScope与@Scope("prototype")的兼容冲突:
    @RefreshScope是Spring Cloud提供的特殊作用域,通过代理模式实现配置刷新,内部默认维护单例代理实例。即便添加@Scope("prototype"),RefreshScope的代理逻辑也会覆盖原型作用域的行为,导致每次请求无法创建新实例。

  2. 自定义构造器导致属性绑定失败:
    @ConfigurationProperties默认依赖无参构造器完成属性注入。你的DataBaseConfigDTO仅提供带参构造器,Spring无法通过反射创建实例并绑定属性,配置刷新时自然无法更新属性值。而Environment直接读取配置源,不受构造器限制,因此能获取最新值。

具体修复步骤

1. 移除冲突的@Scope("prototype")

删除DataBaseConfigDTO上的@Scope("prototype"),RefreshScope本身已能满足配置刷新需求,无需额外指定原型作用域。

2. 添加无参构造器并调整初始化逻辑

给DataBaseConfigDTO添加无参构造器,用@PostConstruct替代构造器完成manager的trim处理,更贴合Spring生命周期:

@ConfigurationProperties(prefix = "isoft")
@Getter
@Setter
@Validated
@RefreshScope
public class DataBaseConfigDTO {
    private Map<String, String> datasource;
    private List<String> maintainers;
    private String manager;

    // 必须添加无参构造器,供@ConfigurationProperties实例化使用
    public DataBaseConfigDTO() {}

    // 用@PostConstruct处理manager的trim逻辑
    @PostConstruct
    public void init() {
        if (manager != null) {
            this.manager = manager.trim();
        }
    }
}

3. 正确注入RefreshScope代理实例

避免直接通过ApplicationContext.getBean获取对象,改为依赖注入方式,确保拿到的是RefreshScope的代理实例:

@RestController
@RequestMapping(path = "/api/v1/loans", produces = {MediaType.APPLICATION_JSON_VALUE})
@AllArgsConstructor
@Validated
public class LoansController {
    // 直接注入DataBaseConfigDTO,Spring自动提供RefreshScope代理实例
    private final DataBaseConfigDTO dataBaseConfigDTO;
    private final Environment environment;
    
    @GetMapping("/props")
    public ResponseEntity<DataBaseConfigDTO> getProps() {
        return ResponseEntity.ok(dataBaseConfigDTO);
    }
}

4. 验证刷新流程

修改GitHub仓库中的application.yml后,调用POST /actuator/refresh触发配置刷新,再请求/api/v1/loans/props即可获取最新属性值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 05:42:43