spring注入靜態變量有幾種方法?春節假期虹貓藍兔三千問

語言: CN / TW / HK

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站均有視頻解説,歡迎來玩。

如果你覺得這篇文章有用,別忘了點贊+關注,一起進步!