天天看點

結合SpEL使用@Value-基于配置檔案或非配置的檔案的值注入-Spring Boot

本文主要介紹Spring @Value 注解注入屬性值的使用方法的分析,文章通過示例代碼非常詳細地介紹,對于每個人的學習或工作都有一定的參考學習價值

在使用spring架構的項目中,@Value是經常使用的注解之一。其功能是将與配置檔案中的鍵對應的值配置設定給其帶注解的屬性。在日常使用中,我們常用的功能相對簡單。本文使您系統地了解@Value的用法。

@Value注入形式

根據注入的内容來源,@ Value屬性注入功能可以分為兩種:通過配置檔案進行屬性注入和通過非配置檔案進行屬性注入。

非配置檔案注入的類型如下:

  • 注入普通字元串
  • 注入作業系統屬性
  • 注射表達結果
  • 注入其他bean屬性
  • 注入檔案資源
  • 注入URL資源

基于配置檔案的注入

首先,讓我們看一下配置檔案中的資料注入,無論它是預設加載的application.properties還是自定義my.properties文檔(需要@PropertySource額外加載)。例如:application.properties屬性值以以下形式定義:

user.name=admin
           

my.properties配置檔案中定義的屬性如下:

user.password=pwd123
           

然後,在bean中使用@Value,如下所示:

@PropertySource("classpath:my.properties")
@RestController
public class ValueController {

  /**
   *Get in application.properties Properties configured in
   */
  @Value("${user.name}")
  private String name;

  /**
   *Get in my.properties Configuration properties in
   */
  @Value("${user.password}")
  private String password;

}
           

差別在于,在spring boot項目中,如果使用my.properties檔案,則需要通過類中的@ PropertySource導入配置檔案,而application.properties中的屬性将自動加載。

同時,您不僅可以通過@Value注入單個屬性,還可以采用數組和清單的形式。例如,配置如下:

tools=car,train,airplane
           

可以通過以下方式注入它:

/**
 *Injection array (automatically split according to ",")
 */
@Value("${tools}")
private String[] toolArray;

/**
 *Injection list form (automatic segmentation based on "," and)
 */
@Value("${tools}")
private List<String> toolList;
           

預設情況下,spring将以“,”分割,并将其轉換為相應的數組或清單。

基于非配置檔案的注入

在使用示例說明基于非配置檔案注入屬性的執行個體之前,讓我們看一下SpEl。

Spring Expression Language是Spring表達式語言,可以在運作時查詢和操作資料。使用#{…}作為操作符号,大括号中的所有字元均視為SpEl。

讓我們看一下特定執行個體場景的應用:

/**
 *執行個體化一個字元串,并賦予預設值
 */
@Value
private String wechatSubscription;

/**
 *讀取系統的環境變量
 */
@Value("#{systemProperties['os.name']}")
private String systemPropertiesName;

/**
 *注入表達式計算結果
 */
@Value("#{ T(java.lang.Math).random() * 100.0 }")
private double randomNumber;

/**
 *讀取一個bean:config的tool屬性并注入
 */
@Value("#{config.tool}")
private String tool;

/**
 *将words用“|”分隔為字元串數組
 */
@Value("#{'${words}'.split('\|')}")
private List<String> numList;

/**
 *注入一個檔案資源
 */
@Value("classpath:config.xml")
private Resource resourceFile;

/**
 *注入 URL 資源
 */
@Value("http://www.choupangxia.com")
private URL homePage;
           

上面的示例顯示了以下方案的使用:

  1. 直接注入字元串等效于執行個體化時直接初始化字元串。初始化空串
  2. 通過#{}注入系統變量。
  3. 表達式計算結果通過#{}注入。
  4. 通過#{}注入其他bean的屬性。
  5. 通過{}和$ {}的組合注入屬性,然後拆分。
  6. 注入檔案資源,并将相應的字元串值轉換為相應的資源檔案。
  7. 注入URL資源并将相應的URL字元串轉換為URL。

預設值注入

無論使用#{}(SpEL)還是$ {}進行屬性注入,當無法獲得相應的值時,都需要設定預設值,可以通過以下方式進行設定。

/**
 *If IP is not configured in the property, the default value is used
 */
@Value("${ip:127.0.0.1}")
private String ip;

/**
 *If the value of port is not obtained in the system properties, 8888 is used.
 */
@Value("#{systemProperties['port']?:'8888'}")
private String port;
           

$ {}中直接使用“:”來設定未定義或空值的預設值,而#{}則需要使用“?:”來設定未設定屬性的預設值。

歡迎關注我的部落格,裡面有很多精品合集

  • 本文轉載注明出處(必須帶連接配接,不能隻轉文字):字母哥部落格。

覺得對您有幫助的話,幫我點贊、分享!您的支援是我不竭的創作動力! 。另外,筆者最近一段時間輸出了如下的精品内容,期待您的關注。

  • 《手摸手教你學Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2一本通》
  • 《實戰前後端分離RBAC權限管理系統》
  • 《實戰SpringCloud微服務從青銅到王者》
  • 《VUE深入淺出系列》