Java SpringBoot

普通变量

首先来看看,如何给普通变量注入值?
例如,application-dev.yml 配置文件有如下配置:
SpringBoot中静态变量注入方案 - 图1
给普通变量赋值时,直接在变量声明之上添加@Value()注解即可,如下所示:
SpringBoot中静态变量注入方案 - 图2

静态变量

例如给项目中的文件上传封装一个工具类。阿里云oss的相关信息配置在配置文件中,需要将信息注入到工具类中的变量。为了方便直接使用变量,把变量定义为静态变量。当要给静态变量注入值的时候,若是在静态变量声明之上直接添加@Value()注解是无效的。如下图所示。
SpringBoot中静态变量注入方案 - 图3
SpringBoot中静态变量注入方案 - 图4

解决方案

方案一

若要给静态变量赋值,可以使用set()方法注入。

  1. 类上加入@Component注解
  2. @Value注解标记set方法
  3. 方法名(例如setOssUrl)和参数名(例如ossUrl)可以任意命名如下所示:

SpringBoot中静态变量注入方案 - 图5

方案二

如果觉得@Value注解麻烦,可以使用@ConfigurationProperties注解代替,这样比较简洁

  1. 前缀要写合适
  2. 方法名(例如setOssUrl)必须和属性保持一致,例如写为setUrl()会注入失败
  3. 类上加入@Component注解

SpringBoot中静态变量注入方案 - 图6
SpringBoot中静态变量注入方案 - 图7

方案三

  1. 类上加入@Component注解
  2. @PostConstruct注解修饰的方法中进行赋值操作

SpringBoot中静态变量注入方案 - 图8

使用场景

那么问题来了,什么场景下需要把值注入到静态变量?

场景一

这个主要看静态的使用场景。比如:一个配置文件中的一个变量,多个类中都要用到,在多个类中都通过@Value方式获取也可以,但是弊端是:同一个参数,就有了多处引用的地方,一旦出现问题,只通过使用的的地方不方便看到,要全局搜。如果使用public static注入,那么整个项目使用的这个配置参数都是一致的,统一的。

场景二

工具类中将值注入静态变量,就可以直接在静态方法之中使用。