最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Spring如何注入靜態(tài)變量

 更新時間:2023年06月26日 10:27:36   作者:東方甲乙木土  
這篇文章主要為大家詳細(xì)介紹了Spring是如何注入靜態(tài)變量的,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下

為什么 Spring 不可以注入靜態(tài)變量

@Autowired 不能注入 static 成員屬性

靜態(tài)變量和靜態(tài)方法屬于類,而 Spring 容器中管理的是對象,使用 @Autowired 注入的是容器中的對象實例,靜態(tài)變量和方法是不能直接使用 @Autowried 注入的。

Spring 不建議開發(fā)代碼中為靜態(tài)變量注入屬性值,類加載時會優(yōu)先加載靜態(tài)變量,此時 Spring 的上下文環(huán)境還沒有完成加載,因此不可以為靜態(tài)變量綁定值。

另一方面,在 @Autowired 注解注入掃描 Class 類原數(shù)據(jù)時,會直接忽略類的使用 static 關(guān)鍵字標(biāo)識的成員。

使用 @Value 讀取配置文件時,配置文件內(nèi)容會作為 Properties 對象的屬性管理在容器中,使用注解加載到變量上時就是使用容器注入的機(jī)制將配置內(nèi)容賦值給相應(yīng)屬性。

@Value 注解標(biāo)注靜態(tài)變量

如果 @Value 注解標(biāo)注在 static 或 final 變量,并不能將屬性值注入,最終得到的變量值是 null。

Spring 注入內(nèi)容到靜態(tài)變量中

@Value + set 方法注入靜態(tài)變量

如果想要為 static 變量注入值,可以間接的操作方式,比如可以通過注解標(biāo)注在 set 方法(非靜態(tài))上,使用 set 方法注入的方式將屬性值賦值到靜態(tài)變量中。

 @Component
 public class Customer {
 ? ? private static String name;
 ? ? @Value("${customer.name}")
 ? ? public void setName(String name) {
 ? ? ? ? Customer.name = name;
 ? ? }
 }

定義靜態(tài)方法工具類時,則不建議在工具類中使用注入的內(nèi)容,因為工具類定義的是靜態(tài)方法,使用時容器并沒有加載完成,容易出現(xiàn) NPE 問題。

Properties 注入靜態(tài)變量

Properties 作為 java.util 包中用來讀取配置文件的類,其本身是一個 Hashtable,可以將 *.properties 配置文件內(nèi)容以鍵值對的形式存儲在對象中。

Properties 使用時可以通過 load() 方法自定義指定需要讀取的配置文件,通過流的方式讀取文件中內(nèi)容,并通過 getProperty() 方法讀取指定配置信息。

因為 Properties 是通過讀取文件內(nèi)容來獲取配置文件,不依賴 Spring 容器的加載,只要指定讀取配置文件后,就可以獲取到對應(yīng)的屬性,可以在加載類時賦值到靜態(tài)變量。

具體使用方法為

Properties 讀取文件工具類

public class PropertiesUtil {
 ? ?private static Properties readProperties(String configFile) {
 ? ? ? ?Properties properties = new Properties();
 ? ? ? ?try {
 ? ? ? ? ? properties.load( new ClassPathResource(path).getInputStream());
 ? ? ?  } catch (IOException e) {
 ? ? ? ? ? ?e.printStackTrace();
 ? ? ?  }
 ? ? ? ?return properties;
 ?  }
}

使用 Properties 注入靜態(tài)變量

@Component
 public class Customer {
 ? ? private static Properties properties = PropertiesUtil.readProperties("application.properties");
 ? ? private static String name = properties.getProperty("name");
 }

Properties 作為 Java 工具包中讀取配置文件的類,可以讀取配置并賦值給靜態(tài)變量,但是 Properties 僅可以讀取 .properties 配置文件,而不可以解析 .yml 配置文件。

詳細(xì)的 Properties 使用方法可見:SpringBoot 使用 Properties 讀取配置文件

Environment 注入靜態(tài)變量

Spring 中有一個類 Environment,它可以被認(rèn)為是當(dāng)前應(yīng)用程序正在運行的環(huán)境,繼承了 PropertyResolver 接口,因此可以作為一個屬性解析器使用。

Environment 可以從容器中注入,并使用對象的 getProperty() 方法來獲取屬性值。

只要在類加載靜態(tài)屬性時獲取到初始化的 Environment 對象信息,就可以為靜態(tài)變量賦值。

可以通過 @Autowired + set 方法將 Environment 對象注入到靜態(tài)變量中,然后使用靜態(tài)變量獲取配置項即可。

@Component
public class Customer {
 ? ?private static Environment env;
 ? ?@Autowired
 ? ?public void setEnvironment(Environment environment) {
 ? ? ? ?env = environment;
 ?  }
 ? ?private static String name = ?env.getProperty("name");
}

Environment 可以讀取 .properties 配置文件和 .yml 配置文件,是更好的一種選擇。

綜述

綜上所述,有如下結(jié)論:

  • 在 Spring 項目中不建議將內(nèi)容注入到靜態(tài)變量中,因此稍有疏忽則會出現(xiàn) NPE 問題
  • 如果使用 @Component、@Value、@Autowired 等注解委婉的實現(xiàn)了注入到靜態(tài)變量中,但其終究還是在 Spring 容器加載之后進(jìn)行加載賦值的,實際使用仍依賴 Spring 容器環(huán)境
  • 如果是單純的 Java 靜態(tài)工具類,則應(yīng)該使用 Properties 類加載文件的方式,這樣才可以完全不依賴 Spring 環(huán)境的運行。

到此這篇關(guān)于詳解Spring如何注入靜態(tài)變量的文章就介紹到這了,更多相關(guān)Spring注入靜態(tài)變量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring控制反轉(zhuǎn)和依賴注入超詳細(xì)講解

    Spring控制反轉(zhuǎn)和依賴注入超詳細(xì)講解

    控制反轉(zhuǎn)(IoC)與依賴注入(DI)是密切相關(guān)的概念,它們通常一起出現(xiàn)在討論Spring框架時,這篇文章主要介紹了Spring控制反轉(zhuǎn)和依賴注入的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-10-10
  • Java 隊列Queue從原理到實戰(zhàn)指南

    Java 隊列Queue從原理到實戰(zhàn)指南

    本文介紹了Java中隊列(Queue)的底層實現(xiàn)、常見方法及其區(qū)別,通過LinkedList和ArrayDeque的實現(xiàn),以及循環(huán)隊列的概念,展示了如何高效地進(jìn)行元素的入隊、出隊和查看操作,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • Java中Spring的Security使用詳解

    Java中Spring的Security使用詳解

    這篇文章主要介紹了Java中Spring的Security使用詳解,在web應(yīng)用開發(fā)中,安全無疑是十分重要的,選擇Spring Security來保護(hù)web應(yīng)用是一個非常好的選擇,需要的朋友可以參考下
    2023-07-07
  • Java之多個線程順序循環(huán)執(zhí)行的幾種實現(xiàn)

    Java之多個線程順序循環(huán)執(zhí)行的幾種實現(xiàn)

    這篇文章主要介紹了Java之多個線程順序循環(huán)執(zhí)行的幾種實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • SpringBoot Admin的簡單使用的方法步驟

    SpringBoot Admin的簡單使用的方法步驟

    本文主要介紹了SpringBoot Admin的簡單使用的方法步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java應(yīng)用開源框架實現(xiàn)簡易web搜索引擎

    Java應(yīng)用開源框架實現(xiàn)簡易web搜索引擎

    本篇文章主要介紹了Java應(yīng)用開源框架實現(xiàn)簡易web搜索引擎,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Java開發(fā)環(huán)境不再需要配置classpath問題

    Java開發(fā)環(huán)境不再需要配置classpath問題

    這篇文章主要介紹了Java開發(fā)環(huán)境不再需要配置classpath問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • SpringCloud使用Feign實現(xiàn)遠(yuǎn)程調(diào)用的使用示例

    SpringCloud使用Feign實現(xiàn)遠(yuǎn)程調(diào)用的使用示例

    Feign是一個基于注解的HTTP客戶端庫,它允許您將HTTP請求轉(zhuǎn)換為聲明式的Java接口,本文主要介紹了SpringCloud使用Feign實現(xiàn)遠(yuǎn)程調(diào)用的使用示例,感興趣的可以了解一下
    2023-09-09
  • java中join方法的理解與說明詳解

    java中join方法的理解與說明詳解

    這篇文章主要給大家介紹了關(guān)于java中join方法的理解與說明的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • java多線程編程之管道通信詳解

    java多線程編程之管道通信詳解

    這篇文章主要為大家詳細(xì)介紹了java多線程編程之線程間的通信,探討使用管道進(jìn)行通信,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評論

石泉县| 沅江市| 易门县| 英山县| 洪洞县| 岳阳市| 黄大仙区| 郁南县| 尚义县| 灵台县| 新津县| 祥云县| 鹤山市| 台安县| 黔东| 梧州市| 盐城市| 临夏市| 沙雅县| 岳阳县| 潍坊市| 宝鸡市| 苍南县| 灌阳县| 视频| 闽侯县| 错那县| 盐城市| 浦江县| 平昌县| 宽甸| 故城县| 乐安县| 雅安市| 金川县| 工布江达县| 色达县| 建水县| 綦江县| 通许县| 卫辉市|