spring注入静态变量有几种方法?春节假期虹猫蓝兔三千问
theme: geek-black highlight: atom-one-dark
我正在参加「兔了个兔」创意投稿大赛,详情请看:「兔了个兔」创意投稿大赛
春节了,虹猫放假回家碰到了蓝兔。
虹猫: 蓝兔好久不见。我最近有个困惑,springboot中经常会用到properties文件中的配置,一般使用@Value注入,但是针对Utils工具类,需要注入一个静态变量,我用@Value为什么注入的值为null?
蓝兔: 因为@Value不支持静态变量注入,你可以尝试使用set方法上写@Value注入。当然还有其他几种方法,我一起给你讲解。
虹猫: 好啊。能给我代码示例讲解吗?
蓝兔: 搬好小板凳,听我细细说来。
代码示例
如果直接使用@Value注入是什么结果? ```java /* * 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注入(推荐)
```java @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,将导致注入失败,比如java @Value("${static.value}") public static void setStaticValue(String staticValue) { StaticInjectionUtils.staticValue = staticValue; }
-
注意点2:
静态变量不要用this引用,要用类名.变量
,虽然你用this也能工作。java @Value("${static.value}") public void setStaticValue(String staticValue) { this.staticValue = staticValue; }
至于为什么用this也能生效,知道的同学可以留言讨论~ -
注意点3:
方法名无所谓,你可以随便改,不信你试试。
😁PostConstruct注入
```java @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变体
```java @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站均有视频解说,欢迎来玩。如果你觉得这篇文章有用,别忘了点赞+关注,一起进步!
- spring注入静态变量有几种方法?春节假期虹猫蓝兔三千问
- stream的实用方法和注意事项
- 【Java实用技术】字符串的拆分用什么方法好?有一半程序员都掉过split坑
- 【Java实用技术】字符串的截取用什么方法好?
- 【Java实用技术】java中关于整数的几个冷知识,总有一个你不知道
- 又是时间格式化问题,诡异的是只有10月份BUG才出现
- 我决定写一本Java实用技术,特点实用!实用!还是实用!
- 5 款新型 Linux 命令行工具,实用!
- 5 款新型 Linux 命令行工具,实用!
- Nginx 的 5 大应用场景,太实用了!
- 自定义双向绑定框架-只需一个注解,简单实用
- RabbitMQ 延迟队列,太实用了!
- Spring 中的重试机制,简单、实用!
- 推荐一款 ES 集群可视化工具:Cerebro,简单、实用!