首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring EL 表達式進階用法大全:屬性注入、集合操作、正則、系統屬性與 Bean 互調

     編輯:Java 綜合教學

Spring Expression Language (SpEL) 實戰場景全覽

Spring EL(#{...})與屬性佔位符(${...})雖語法相似,但能力差異巨大。本文彙總 9 大高頻實戰場景,助你靈活駕馭配置與注入。

核心語法區別速查

語法用途特性
${...}讀取 .properties/YAML 配置單值解析,取最後匹配值
#{...}SpEL 表達式支援運算、方法調用、集合、正則、Bean 互調,取所有匹配值

1. 從配置檔讀取屬性(${...})

# application.properties
app.name=我的應用

@Value("${app.name}")
private String appName;

2. 缺失值提供預設值

@Value("${app.desc:預設描述}")  // 單引號包裹字串字面值
private String desc;

3. EL 內部操作字串、分割轉集合

# 配置: app.tags=tag1,tag2,tag3
@Value("#{'${app.tags}'.split(',')}")
private List<String> tagList;

4. 三元運算符

@Value("${env=='prod'?'生產環境':'測試環境'}")
private String envDesc;

// 也可直接用於方法參數
@GetMapping("/env")
public String env(@Value("${env=='prod'?'生產':'測試'}") String desc) { ... }

5. 正則表達式匹配(需 #{...})

@Value("#{'12345' matches '\\d+'}")  // true
private boolean isNumeric;

6. 注入系統屬性(JVM -D 參數)

@Value("#{systemProperties['os.name']}")  // Windows 10, Mac OS X 等
private String osName;

@Value("#{systemProperties['user.timezone']}")
private String timezone;

7. 呼叫靜態方法(T(Type) 語法)

@Value("#{T(java.lang.Math).random() * 100}")
private double randomVal;  // 注意:啟動時只計算一次,非每次調用

// 自定義工具類
@Value("#{T(com.example.util.IdGenerator).nextId()}")
private long orderId;

8. 直接注入 Classpath 資源檔案

@Value("classpath:templates/email/welcome.txt")
private Resource welcomeTpl;

@GetMapping("/welcome")
public String welcome() throws IOException {
    return IOUtils.toString(welcomeTpl.getInputStream(), StandardCharsets.UTF_8);
}

提示:讀取資源內容推薦使用 org.apache.commons.io.IOUtils 或 FileCopyUtils。

9. 互調另一個 Bean 的方法回傳值

@Component("configProvider")
public class ConfigProvider {
    public String getActiveProfile() { return "production"; }
}

// 另一個 Bean 注入
@Value("#{configProvider.activeProfile}")  // 呼叫 getter
// 或
@Value("#{configProvider.getActiveProfile()}")
private String activeProfile;

注意:被調用 Bean 建議明確指定 @Component("beanName"),避免預設命名衝突。


進階技巧:內聯 Map/List 建構

@Value("#{{'k1':'v1','k2':'v2'}}")
private Map<String,String> map;

@Value("#{'a,b,c'.split(',')}")
private List<String> list;

總結

  • ${...} 專注配置解析,#{...} 專注運算邏輯。
  • 複雜邏輯建議移至 @Configuration 類的 @Bean 方法中,保持 Controller/Service 簡潔。
  • SpEL 功能強大但過度使用會降低可讀性,關鍵業務邏輯請用 Java 代碼實現。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved