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

Spring Boot:使用不同前缀的多个相似ConfigurationProperties

复用@ConfigurationProperties处理多相似服务配置

当然可以!这种场景下你完全可以复用同一个@ConfigurationProperties类,通过在注入阶段指定不同前缀来绑定不同的服务配置,这也是Spring Boot配置属性体系里非常实用的小技巧,能帮你避免写重复的配置类。

下面是具体的实现步骤:

1. 定义通用的配置属性类

先把你的ServiceProperties类调整成通用版本,不要在类上固定前缀,留到后续创建Bean时动态指定:

// 这里可以去掉@Component,因为我们会通过@Bean手动创建实例,保留也不影响
@ConfigurationProperties
public class ServiceProperties {
    private String url;
    private String port;

    // 必须提供Getter和Setter,Spring需要通过它们绑定属性
    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getPort() {
        return port;
    }

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

2. 创建不同前缀的配置Bean

写一个配置类,通过@Bean方法分别创建对应serviceA和serviceB的配置实例,每个Bean用@ConfigurationProperties(prefix = "...")指定对应的前缀:

@Configuration
public class ServiceConfig {

    // 绑定serviceA的配置
    @Bean
    @ConfigurationProperties(prefix = "serviceA")
    public ServiceProperties serviceAProperties() {
        return new ServiceProperties();
    }

    // 绑定serviceB的配置
    @Bean
    @ConfigurationProperties(prefix = "serviceB")
    public ServiceProperties serviceBProperties() {
        return new ServiceProperties();
    }
}

这样两个Bean会分别读取application.yml中对应前缀下的url和port属性,相互独立不会干扰。

3. 编写application.yml配置

按照你原来的需求,调整为YAML风格即可:

serviceA:
  url: abc.com
  port: 80

serviceB:
  url: def.com
  port: 8080

4. 注入并使用配置

在需要使用配置的地方,通过@Qualifier注解区分要注入的是哪个配置Bean(因为两个Bean类型相同,Spring需要明确指定):

@Service
public class ServiceManager {

    private final ServiceProperties serviceAProps;
    private final ServiceProperties serviceBProps;

    // 构造注入(Spring Boot 2.2+推荐,无需@Autowired)
    public ServiceManager(@Qualifier("serviceAProperties") ServiceProperties serviceAProps,
                          @Qualifier("serviceBProperties") ServiceProperties serviceBProps) {
        this.serviceAProps = serviceAProps;
        this.serviceBProps = serviceBProps;
    }

    public void showServiceInfo() {
        System.out.println("Service A: " + serviceAProps.getUrl() + ":" + serviceAProps.getPort());
        System.out.println("Service B: " + serviceBProps.getUrl() + ":" + serviceBProps.getPort());
    }
}

额外小提示

  • 如果你的项目开启了Spring Boot的配置元数据支持(默认自动处理),IDEA这类IDE会给你提供配置项的自动补全,非常方便。
  • 如果你不想写单独的ServiceConfig类,也可以用@EnableConfigurationProperties配合@Qualifier在组件里直接注入,但上面的方式更清晰,便于统一管理配置Bean。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:18:01