问题1:static/final修饰的变量
问题重现:读取配置文件(**.yml)中的值,获取为null
// 读取配置文件(**.yml)中的值
@Value(value = "${upload.minio.minio_url}")
private static String minioUrl;
问题解析:
java中static/final修饰的变量,通过@Value是获取不到值的。
问题解决方案:
方案一:在变量的seter方法上使用@Value
1.静态变量的setter 方法需要去掉 static 修饰词,
2.并需要使用public修饰,
3.最后需要注意要在类上加上@Component 、@Configuration等衍生注解 ,才可以成功注入。
@Value(value = "${upload.minio.minio_url}")
public static void setMinioUrl(String minioUrl) {
MinioUtil.minioUrl = minioUrl;
}
方案二:通过中间变量赋值:在类上加上@Component 、@Configuration等衍生注解
private static String minioUrl;
@Value(value = "${upload.minio.minio_url}")
private String minioUrl2;
@PostConstruct
public void init() {
minioUrl = minioUrl2;
}
问题2:@Configuration修饰的类中创建了诸多的bean方法
问题重现:类中创建了bean,读取配置文件(**.yml)中的值,获取为null
问题解析:
spring自动装配顺序:
- 1、扫描所有的bean
- 2、初始化、注入bean
@Value/@ConfigurationProperties方法在2,所以在扫描bean的时候,有可能就拿不到值
问题解决方案:
1、类实现EnvironmentAware,并设置Environment
2、env.getProperty(key)获取 .yml 中的值
总结: 解决方案有两种,都是间接的通过非static的变量获取到值,从而拿到.yml中的值;但是,两种方法中都需要在类上加上@Component。