如何在静态final常量工具类中读取application.properties配置
解决方案
下面提供两种不影响原有引用的简便方案,核心思路是利用Spring的生命周期回调给静态变量赋值,保持原有类名.静态变量的访问方式不变:
方案一:实现EnvironmentAware接口
通过实现Spring的EnvironmentAware接口,在容器初始化时获取环境变量,直接给静态变量赋值:
import org.springframework.context.EnvironmentAware; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; @Component public class ConstantUtils implements EnvironmentAware { // 移除原有的final修饰符,保留static public static String API_BASE_URL; public static int MAX_RETRY_TIMES; @Override public void setEnvironment(Environment environment) { // 从application.properties读取配置,支持设置默认值 API_BASE_URL = environment.getProperty("api.base.url"); MAX_RETRY_TIMES = Integer.parseInt(environment.getProperty("max.retry.times", "3")); } }
方案二:@PostConstruct配合@Value
把工具类声明为Spring Bean,用@Value注入配置到非静态成员变量,再通过@PostConstruct回调赋值给静态变量:
import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class ConstantUtils { // 移除原有的final修饰符,保留static public static String API_BASE_URL; public static int MAX_RETRY_TIMES; // 用@Value注入配置到非静态成员变量 @Value("${api.base.url}") private String apiBaseUrl; @Value("${max.retry.times:3}") private int maxRetryTimes; @PostConstruct public void initStaticConstants() { API_BASE_URL = this.apiBaseUrl; MAX_RETRY_TIMES = this.maxRetryTimes; } }
注意事项
- 必须移除原变量的
final修饰符:final静态变量要求类加载时就确定值,而配置文件加载在Spring容器初始化阶段,晚于类加载,两者冲突。如果需要保证变量不可修改,可在赋值后通过代码逻辑限制,不过通常配置加载后不会变动,无需额外处理。 - 工具类需被Spring扫描:添加
@Component注解,确保Spring能识别并初始化这个Bean,否则回调方法不会执行。 - 原有引用无需修改:项目中所有
ConstantUtils.API_BASE_URL这类调用完全保持不变,不影响业务代码。
内容的提问来源于stack exchange,提问作者Akilan
相关产品推荐
相关产品推荐

