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
相关产品推荐
相关产品推荐

