在上一节中,我们学习了如何使用 @Value 注解读取单个配置项。但在实际项目中,随着微服务数量增加或业务模块复杂化,配置项往往成组出现,例如:
- 多个第三方服务地址;
- 数据库连接参数(URL、用户名、密码、驱动);
- Redis 配置(host、port、timeout、password);
- 文件存储 OSS 配置(endpoint、accessKey、bucketName)等。
如果继续使用 @Value 逐个注入,不仅代码冗长,还难以维护、缺乏类型安全。
✅ 解决方案:使用 @ConfigurationProperties 批量绑定配置到 Java Bean。
1. 场景示例:调用多个微服务
假设当前服务需要同时调用 订单、用户、购物车 三个微服务,配置如下:
# application.yml url: orderUrl: http://localhost:8002 userUrl: http://localhost:8003 shoppingUrl: http://localhost:8004
若用 @Value,需写三次注解;而使用配置类,只需一次注入即可获取全部地址。
2. 定义配置类:MicroServiceUrl
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * 微服务地址配置类 * prefix = "url" 表示绑定 application.yml 中 url 下的所有属性 */ @Component @ConfigurationProperties(prefix = "url") public class MicroAssistantUrl { private String orderUrl; private String userUrl; private String shoppingUrl; // 必须提供 getter 和 setter(Spring 通过 setter 注入值) public String getOrderUrl() { return orderUrl; } public void setOrderUrl(String orderUrl) { this.orderUrl = orderUrl; } public String getUserUrl() { return userUrl; } public void setUserUrl(String userUrl) { this.userUrl = userUrl; } public String getShoppingUrl() { return shoppingUrl; } public void setShoppingUrl(String shoppingUrl) { this.shoppingUrl = shoppingUrl; } }
🔑 关键点说明:
@ConfigurationProperties(prefix = "url"):自动将url.xxx映射到类属性;@Component:将该类注册为 Spring Bean,便于后续注入;- 必须提供 setter 方法(Spring Boot 通过 JavaBean 规范进行属性赋值)。
3. 添加必要依赖(IDE 友好支持)
为了在 IDE 中获得 配置提示、跳转、校验 等功能,建议添加以下依赖(非运行必需,但强烈推荐):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
✅ 添加后,IDEA 或 VS Code 会在
application.yml中自动提示url.orderUrl等字段,并支持 Ctrl+点击跳转到配置类。
4. 在 Controller 中使用配置类
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @RestController @RequestMapping("/test") public class TestController { private static final Logger logger = LoggerFactory.getLogger(TestController.class); @Resource private MicroAssistantUrl microServiceUrl; @GetMapping("/config") public String testConfig() { logger.info("订单服务地址:{}", microServiceUrl.getOrderUrl()); logger.info("用户服务地址:{}", microServiceUrl.getUserUrl()); logger.info("购物车服务地址:{}", microServiceUrl.getShoppingUrl()); return "success"; } }
💡 也可以使用
@Autowired,但@Resource按名称注入更直观(尤其在有多个同类型 Bean 时)。
5. 启动测试
访问:http://localhost:8080/test/config
控制台输出:
订单服务地址:http://localhost:8002 用户服务地址:http://localhost:8003 购物车服务地址:http://localhost:8004
✅ 配置成功加载,且代码简洁、可维护性强!
6. 对比:@Value vs @ConfigurationProperties
| 特性 | @Value |
@ConfigurationProperties |
| 适用场景 | 单个、零散配置 | 成组、结构化配置 |
| 类型安全 | ❌ 无(字符串需手动转换) | ✅ 支持自动类型转换(int、boolean、List、Map 等) |
| 松散绑定 | ❌ 不支持 | ✅ 支持(如 user-name ↔ userName) |
| 配置校验 | ❌ 需手动处理 | ✅ 支持 @Validated + JSR-303 校验 |
| IDE 支持 | 弱 | 强(配合 configuration-processor) |
| 可复用性 | 低 | 高(整个配置对象可注入多处) |
📌 最佳实践:
- 少量简单配置 →
@Value;- 模块化、复杂配置 → 优先使用
@ConfigurationProperties。
7. 进阶技巧(预告)
- 嵌套对象绑定:支持
url.order.service.host映射到UrlConfig.getOrder().getService().getHost(); - List/Map 绑定:
urls: - http://service1 - http://service2
private List<String> urls;
- 配置校验:
@Validated @ConfigurationProperties(prefix = "url") public class MicroServiceUrl { @NotBlank private String orderUrl; }
这些内容将在后续课程中详细展开。
8. 总结
本节课我们解决了 多配置项管理混乱 的问题:
- ✅ 使用
@ConfigurationProperties将一组相关配置封装到一个 Java 类; - ✅ 通过
prefix自动映射 YAML 层级结构; - ✅ 注入配置类即可批量使用,代码更清晰、维护更方便;
- ✅ 配合
spring-boot-configuration-processor提升开发体验。
🎯 记住:好的配置管理,是构建可维护、可扩展系统的第一步。