“springboot中经常会用到properties文件中的配置,一般使用@Value注入,但是针对Utils工具类,需要注入一个静态变量有几种方法?为什么有的同学注入的值为null?
代码示例
如果直接使用@Value注入是什么结果?
/*** the StaticInjectionUtils** @author Java实用技术手册* @date 2023-01-17*/publicclassStaticInjectionUtils { "${normal.value}") (privateStringnormalValue; "${static.value}") (privatestaticStringstaticValue; publicvoidinit() { System.err.println("*** normalValue="+normalValue); System.err.println("*** staticValue="+staticValue); } } // 运行结果//*** normalValue=normal --有结果//*** staticValue=null --无结果
😉set注入(推荐)
publicclassStaticInjectionUtils { publicstaticStringstaticValue; "${static.value}") (publicvoidsetStaticValue(StringstaticValue) { StaticInjectionUtils.staticValue=staticValue; } publicvoidinit() { System.err.println("*** staticValue="+staticValue); } } // *** staticValue=static
- 注意点1:
默认idea的提示set方法会带上static,将导致注入失败,比如
"${static.value}") (publicstaticvoidsetStaticValue(StringstaticValue) { StaticInjectionUtils.staticValue=staticValue; }
- 注意点2:
静态变量不要用this引用,要用类名.变量
,虽然你用this也能工作。
"${static.value}") (publicvoidsetStaticValue(StringstaticValue) { this.staticValue=staticValue; }
至于为什么用this也能生效,知道的同学可以留言讨论~
- 注意点3:
方法名无所谓,你可以随便改,不信你试试。
😁PostConstruct注入
publicclassStaticInjectionUtils { "${static.value}") (privateStringstaticValue; publicstaticStringSTATIC_VALUE2; publicvoidinit() { STATIC_VALUE2=this.staticValue; System.err.println("*** staticValue="+staticValue); System.err.println("*** STATIC_VALUE2="+STATIC_VALUE2); } } ***staticValue=static***STATIC_VALUE2=static
这里使用了2个知识点:
- 利用普通@Value变量可以注入,提前完成配置的变量保存。
- 利用@PostConstruct在@Value之后执行,把普通变量赋值给静态变量。
这里回忆下springbean初始化顺序:方法和注解执行先后顺序为
Constructor -> @Autowired/Value -> @PostConstruct
利用上述原理,可以做很多有用的事情,比如类初始化工作一般专门会写一个init方法。
- 注意点:
staticValue不能声明为static - 这种方法要多定义一个无用变量,所以更推荐set注入。
🤨set变体
publicclassStaticInjectionUtils { privatestaticStringstaticValue; publicvoidsetStaticValue( ("${static.value}") StringstaticValue) { System.out.println("set staticValue="+staticValue); StaticInjectionUtils.staticValue=staticValue; } publicvoidinit() { System.err.println("*** staticValue="+staticValue); } }
这也是set注入的一种变体,方法入参使用@Value注入,然后利用@Autowired,调用此方法注入给static变量。
- 注意点:
- 方法不能有static修饰。
- 方法必须使用
@Autowired
注解。
以上就是本期内容,希望对你有帮助。
“我是Pandas,专注Java编程实用技术分享,公众号《
Java实用技术手册
》和B站均有视频解说,欢迎来玩。如果你觉得这篇文章有用,别忘了点赞+关注,一起进步!