场景: 工具类单例模式,实例化时根据不同环境从.properties或.yml中动态取值
问题解析: Java 中 static/final 修饰的变量,通过 @Value 是获取不到值的
解决方案:
- 在变量 setter方法上使用 @Value
package com.xx.utils.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class AConfig {
public static String url;
public static String appkey;
@Value("${xxx.url}")
public void setUrl(String url) {
AConfig.url = url;
}
@Value("${xxx.appkey}")
public void setAppkey(String appkey) {
AConfig.appkey = appkey;
}
}
- 中间非静态变量赋值
package com.xx.utils.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class AConfig {
public static String url;
@Value("${xxx.url}")
private String url1;
public static String appkey;
@Value("${xxx.appkey}")
private String appkey1;
@PostConstruct
public void init() {
url = url1;
appkey = appkey1;
}
}
总结: 两种解决方案都是间接的通过非 static 的变量获取到值,从而拿到配置文件中的值;但两种方法中都需要在类上加上@Component。