如何基于Spring Configuration Properties优雅动态读取多配置类(非Spring应用)
非Spring应用下优雅使用Spring Configuration Properties管理多配置类
方案核心思路
将配置类与Spring上下文配置解耦,通过统一的配置上下文管理所有配置类,同时封装工具类简化配置读取,既利用Spring Configuration Properties的强大映射能力,又无需将整个应用转为Spring应用。
步骤1:重构单一职责的配置类
每个配置类仅保留@ConfigurationProperties注解,移除@Configuration、@PropertySource及内部配置类,专注于属性映射:
package org.oval.ddi.ws.config; import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(prefix = "ws.remote", ignoreInvalidFields = true) public class Account { private String remoteServiceUrl; private String wsAction; private String logAction; private String apiId; private String type; private int outTime; private String wsSpaceNameRemote; private String query; private String log; // 所有getter、setter方法保持不变,此处省略 }
如果后续新增配置类(如OrderConfig),只需按照相同模式编写:
package org.oval.ddi.ws.config; import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(prefix = "ws.order", ignoreInvalidFields = true) public class OrderConfig { private String orderServiceUrl; private String orderTopic; // getter、setter方法 }
步骤2:创建统一配置上下文
单独编写一个配置类,集中配置属性源并启用所有配置类,新增配置类时仅需在此处添加:
package org.oval.ddi.ws.config; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; @Configuration @PropertySource(encoding="UTF-8", value = "classpath:DDIConfig.properties", ignoreResourceNotFound = true) // 新增配置类时,直接追加到注解参数列表 @EnableConfigurationProperties({Account.class, OrderConfig.class}) public class AppConfigContext { }
步骤3:封装配置读取工具类
编写工具类初始化Spring上下文并提供配置获取接口,避免重复创建上下文,同时支持动态刷新:
package org.oval.ddi.ws.utils; import org.oval.ddi.ws.config.Account; import org.oval.ddi.ws.config.AppConfigContext; import org.oval.ddi.ws.config.OrderConfig; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class ConfigLoader { private static final AnnotationConfigApplicationContext context; static { // 仅初始化一次上下文 context = new AnnotationConfigApplicationContext(AppConfigContext.class); context.registerShutdownHook(); // 程序退出时自动关闭上下文 } public static Account getAccountConfig() { return context.getBean(Account.class); } public static OrderConfig getOrderConfig() { return context.getBean(OrderConfig.class); } // 动态刷新配置(修改属性文件后调用) public static void refreshConfig() { context.refresh(); } }
步骤4:使用示例
在业务代码中直接调用工具类获取配置,无需关心Spring上下文细节:
public class TestConfig { public static void main(String[] args) { // 获取Account配置 Account account = ConfigLoader.getAccountConfig(); System.out.println(account.getRemoteServiceUrl()); // 获取OrderConfig配置 OrderConfig orderConfig = ConfigLoader.getOrderConfig(); System.out.println(orderConfig.getOrderServiceUrl()); // 修改属性文件后,调用刷新方法重新加载配置 ConfigLoader.refreshConfig(); } }
方案优势
- 职责清晰:配置类仅处理属性映射,上下文配置集中管理,代码结构更整洁
- 易于扩展:新增配置类只需两步——编写映射类、在
AppConfigContext中注册 - 性能优化:Spring上下文仅初始化一次,避免重复创建开销
- 支持动态刷新:通过
refreshConfig方法可实现配置的动态更新
内容的提问来源于stack exchange,提问作者hachi
相关产品推荐
相关产品推荐

