我正在参加「兔了个兔」构思投稿大赛,概况请看:「兔了个兔」构思投稿大赛
新年了,虹猫放假回家碰到了蓝兔。
虹猫: 蓝兔好久不见。我最近有个困惑,springboot中经常会用到properties文件中的配置,一般运用@Value注入,但是针对Utils工具类,需要注入一个静态变量,我用@Value为什么注入的值为null?
蓝兔: 因为@Value不支持静态变量注入,你能够测验运用set办法上写@Value注入。当然还有其他几种办法,我一同给你讲解。
虹猫: 好啊。能给我代码示例讲解吗?
蓝兔: 搬好小板凳,听我细细说来。
代码示例
假如直接运用@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个知识点:
- 运用一般@Value变量能够注入,提前完成配置的变量保存。
- 运用@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变量。
- 留意点:
- 办法不能有static润饰。
- 办法必须运用
@Autowired
注解。
以上便是本期内容,希望对你有协助。
我是Pandas,专心Java编程实用技术共享,公众号《
Java实用技术手册
》和B站均有视频解说,欢迎来玩。假如你觉得这篇文章有用,别忘了点赞+重视,一同进步!