问题1:static/final修饰的变量

问题重现:读取配置文件(**.yml)中的值,获取为null

  1. // 读取配置文件(**.yml)中的值
  2. @Value(value = "${upload.minio.minio_url}")
  3. private static String minioUrl;

问题解析:

java中static/final修饰的变量,通过@Value是获取不到值的。

问题解决方案:

方案一:在变量的seter方法上使用@Value

1.静态变量的setter 方法需要去掉 static 修饰词

2.并需要使用public修饰

3.最后需要注意要在类上加上@Component @Configuration等衍生注解 ,才可以成功注入。

  1. @Value(value = "${upload.minio.minio_url}")
  2. public static void setMinioUrl(String minioUrl) {
  3. MinioUtil.minioUrl = minioUrl;
  4. }

方案二:通过中间变量赋值:在类上加上@Component @Configuration等衍生注解

  1. private static String minioUrl;
  2. @Value(value = "${upload.minio.minio_url}")
  3. private String minioUrl2;
  4. @PostConstruct
  5. public void init() {
  6. minioUrl = minioUrl2;
  7. }

问题2:@Configuration修饰的类中创建了诸多的bean方法

问题重现:类中创建了bean,读取配置文件(**.yml)中的值,获取为null

1648548479(1).jpg

问题解析:
spring自动装配顺序:

  • 1、扫描所有的bean
  • 2、初始化、注入bean

@Value/@ConfigurationProperties方法在2,所以在扫描bean的时候,有可能就拿不到值

问题解决方案:
1、类实现EnvironmentAware,并设置Environment
image.png
2、env.getProperty(key)获取 .yml 中的值
image.png

总结: 解决方案有两种,都是间接的通过非static的变量获取到值,从而拿到.yml中的值;但是,两种方法中都需要在类上加上@Component。