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,簡單、實用!