springboot中经常会用到properties文件中的配置,一般使用@Value注入,但是针对Utils工具类,需要注入一个静态变量有几种方法?为什么有的同学注入的值为null?

代码示例

如果直接使用@Value注入是什么结果?

/**
 * the StaticInjectionUtils
 *
 * @author Java实用技术手册
 * @date 2023-01-17
 */
@Component
public class StaticInjectionUtils {
    @Value("${normal.value}")
    private String normalValue;
    @Value("${static.value}")
    private static String staticValue;
    @PostConstruct
    public void init() {
        System.err.println("*** normalValue=" + normalValue);
        System.err.println("*** staticValue=" + staticValue);
    }
}
// 运行结果
//*** normalValue=normal  --有结果
//*** staticValue=null    --无结果

?set注入(推荐)

@Component
public class StaticInjectionUtils {
    public static String staticValue;
    @Value("${static.value}")
    public void setStaticValue(String staticValue) {
        StaticInjectionUtils.staticValue = staticValue;
    }
    @PostConstruct
    public void init() {
        System.err.println("*** staticValue=" + staticValue);
    }
}
// *** staticValue=static
  • 注意点1:

    默认idea的提示set方法会带上static,将导致注入失败,比如

@Value("${static.value}")
public static void setStaticValue(String staticValue) {
    StaticInjectionUtils.staticValue = staticValue;
}
  • 注意点2:

    静态变量不要用this引用,要用类名.变量,虽然你用this也能工作。

@Value("${static.value}")
public void setStaticValue(String staticValue) {
    this.staticValue = staticValue;
}

至于为什么用this也能生效,知道的同学可以留言讨论~

  • 注意点3:

    方法名无所谓,你可以随便改,不信你试试。

?PostConstruct注入

@Component
public class StaticInjectionUtils {
    @Value("${static.value}")
    private String staticValue;
    public static String STATIC_VALUE2;
    @PostConstruct
    public void init() {
        STATIC_VALUE2 = this.staticValue;
        System.err.println("*** staticValue=" + staticValue);
        System.err.println("*** STATIC_VALUE2=" + STATIC_VALUE2);
    }
}
*** staticValue=static
*** STATIC_VALUE2=static

这里使用了2个知识点:

  1. 利用普通@Value变量可以注入,提前完成配置的变量保存。
  2. 利用@PostConstruct在@Value之后执行,把普通变量赋值给静态变量。

这里回忆下springbean初始化顺序:方法和注解执行先后顺序为

Constructor -> @Autowired/Value -> @PostConstruct

利用上述原理,可以做很多有用的事情,比如类初始化工作一般专门会写一个init方法。

  • 注意点:

    staticValue不能声明为static

  • 这种方法要多定义一个无用变量,所以更推荐set注入。

?set变体

@Component
public class StaticInjectionUtils {
    private static String staticValue;
    @Autowired
    public void setStaticValue(@Value("${static.value}") String staticValue) {
        System.out.println("set staticValue="+staticValue);
        StaticInjectionUtils.staticValue = staticValue;
    }
    @PostConstruct
    public void init() {
        System.err.println("*** staticValue=" + staticValue);
    }
}

这也是set注入的一种变体,方法入参使用@Value注入,然后利用@Autowired,调用此方法注入给static变量。

  • 注意点:
  1. 方法不能有static修饰。
  2. 方法必须使用@Autowired注解。

以上就是本期内容,希望对你有帮助。

我是Pandas,专注Java编程实用技术分享,公众号《Java实用技术手册》和B站均有视频解说,欢迎来玩。

如果你觉得这篇文章有用,别忘了点赞+关注,一起进步!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。