《肉蔻之香2:意大利风情下的情欲暗涌与命运交织》

核心内容摘要

探索未知,唤醒激情:一段颠覆感官的旅程
亚洲无码系列:揭秘东方韵味,感受极致真实

青春的荷尔蒙:白袜体育生的禁忌心事

视频看了几百小时还迷糊关注我几分钟让你秒懂

需求场景为什么需要自定义配置管理器在实际开发中我们经常遇到这些痛点配置项散落在多个Value注解中难以维护某些配置有复杂的校验逻辑如邮箱格式、IP白名单需要将一组相关配置封装成一个对象比如支付网关的appId、secretKey、notifyUrl希望配置变更时能自动刷新但又不想每个字段都加RefreshScope这时候自定义配置管理器Configuration Properties Class就派上用场了✅ 简单说把零散的配置“打包”成一个 Java Bean代码更清晰、更安全、更易测试️

正例Spring Boot 正确使用自定义配置管理器

添加必要依赖通常已包含dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter/artifactId /dependency !-- 如果用到 validation 校验 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-validation/artifactId /dependency

创建配置类核心import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; Component ConfigurationProperties(prefix app.payment) // 对应 application.yml 中的前缀 public class PaymentConfig { NotBlank(message appId 不能为空) private String appId; NotBlank(message secretKey 不能为空) private String secretKey; Email(message 通知邮箱格式不正确) private String notifyEmail; NotNull(message 超时时间不能为 null) private Integer timeoutSeconds 30; // 默认值 // 必须提供 getter/setterLombok 可简化 public String getAppId() { return appId; } public void setAppId(String appId) { this.appId appId; } public String getSecretKey() { return secretKey; } public void setSecretKey(String secretKey) { this.secretKey secretKey; } public String getNotifyEmail() { return notifyEmail; } public void setNotifyEmail(String notifyEmail) { this.notifyEmail notifyEmail; } public Integer getTimeoutSeconds() { return timeoutSeconds; } public void setTimeoutSeconds(Integer timeoutSeconds) { this.timeoutSeconds timeoutSeconds; } Override public String toString() { return PaymentConfig{ appId appId \ , notifyEmail notifyEmail \ , timeoutSeconds timeoutSeconds }; } } 注意从 Spring Boot

2 开始ConfigurationProperties不再默认启用需通过EnableConfigurationProperties或直接加Component。

在application.yml中配置app: payment: app-id: pay_2026 secret-key: sk_live_xxxxxx notify-email: financecompany.com timeout-seconds: 60 Spring Boot 自动将app.payment.xxx映射到PaymentConfig的属性支持驼峰/横线自动转换。

在业务代码中注入使用RestController public class PaymentController { private final PaymentConfig paymentConfig; // 推荐使用构造函数注入更安全、可测试 public PaymentController(PaymentConfig paymentConfig) { this.paymentConfig paymentConfig; } GetMapping(/payment/config) public String showConfig() { return paymentConfig.toString(); } }

启动验证启动应用访问/payment/config→ 返回配置内容如果notify-email填了xxxcom非法邮箱启动会直接报错提前暴露问题✅ 安全、结构化、可校验、易维护❌

反例常见错误写法千万别这么干反例 1不用配置类全靠Value散装配置RestController public class BadPaymentService { Value(${app.payment.app-id}) private String appId; Value(${app.payment.secret-key}) private String secretKey; Value(${app.payment.notify-email}) private String notifyEmail; // 10个配置就要写10个 Value改个前缀累死人 } 问题难以复用无法统一校验重构成本高不支持嵌套对象。

反例 2忘记加Component或EnableConfigurationProperties// ❌ 缺少 ComponentSpring 不会把它当 Bean 管理 ConfigurationProperties(prefix app.payment) public class PaymentConfig { // ... } 后果注入时NoSuchBeanDefinitionException反例 3属性没有 setter 方法或 Lombok 没生效// ❌ 没有 setterSpring 无法赋值 public class PaymentConfig { private String appId; // 只有 getter } 后果所有字段都是null⚠️

高级技巧

注意事项

支持嵌套对象ConfigurationProperties(prefix app.system) Component public class SystemConfig { private Database database; private Cache cache; // getter/setter public static class Database { private String url; private String username; // getter/setter } public static class Cache { private String type; private int ttl; // getter/setter } }对应 YAMLapp: system: database: url: jdbc:mysql://... username: root cache: type: redis ttl:

配合 Nacos 实现动态刷新进阶如果配置来自 Nacos只需在配置类上加RefreshScopeComponent RefreshScope // ⭐ 支持 Nacos 动态刷新 ConfigurationProperties(prefix app.payment) public class PaymentConfig { // ... } 注意RefreshScope会代理整个 Bean性能略低建议只用于真正需要动态更新的配置。

配置元数据提升 IDE 体验添加spring-configuration-metadata.json或使用注解生成IDE 能智能提示配置项Validated ConfigurationProperties(prefix app.payment) public class PaymentConfig { /** * 支付平台分配的应用ID */ private String appId; /** * API 调用超时时间秒默认30秒 */ private Integer timeoutSeconds 30; }编译后会在META-INF/spring-configuration-metadata.json自动生成描述IDE 输入app.payment.时会有提示

五、

总结对比方式优点缺点Value散装简单直接难维护、无校验、无法分组自定义配置类结构清晰、支持校验、可复用、IDE友好需写类和 getter/setter配置类 Nacos动态刷新 集中管理需额外依赖✅ 最佳实践凡是超过2个相关配置就封装成 ConfigurationProperties 类视频看了几百小时还迷糊关注我几分钟让你秒懂

未满十八岁免费观看电视剧的软件看-未满十八岁免费观看电视剧的软件看应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123