Spring IoC注入一些簡單的值的幾種常見方法
我們來梳理一下最常見的幾種用法:
方法一:注入配置文件中的屬性(最常用)
這是最核心的用法。假設我們有一個標準的 Spring Boot 項目,其配置文件 application.properties 內(nèi)容如下:
src/main/resources/application.properties
# 應用信息 app.name=My Awesome App app.version=1.2 # 作者信息 author.name=Alice author.email=alice@example.com # 功能開關和配置 feature.email.enabled=true max.pool.size=100
現(xiàn)在,我們想創(chuàng)建一個 AppInfoService 組件,并將這些配置值注入進去。
AppInfoService.java
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
public class AppInfoService {
// 1. 注入字符串
@Value("${app.name}")
private String appName;
// 2. 注入數(shù)字(Spring會自動進行類型轉(zhuǎn)換)
@Value("${app.version}")
private double appVersion;
@Value("${max.pool.size}")
private int maxPoolSize;
// 3. 注入布爾值
@Value("${feature.email.enabled}")
private boolean isEmailEnabled;
// 4. 提供默認值
// 如果配置文件中沒有 `app.description`,則使用默認值 "A great application"
@Value("${app.description:A great application}")
private String appDescription;
public void displayAppInfo() {
System.out.println("Application Name: " + appName);
System.out.println("Application Version: " + appVersion);
System.out.println("Max Pool Size: " + maxPoolSize);
System.out.println("Is Email Feature Enabled: " + isEmailEnabled);
System.out.println("Description: " + appDescription);
}
}
關鍵點解讀:
- 語法
\${...}:這是屬性占位符 (Property Placeholder)。它告訴 Spring:“請到我的環(huán)境配置(包括application.properties、系統(tǒng)變量、JVM參數(shù)等)中去查找...這個鍵,并把它的值注入進來。” - 自動類型轉(zhuǎn)換:你只需要定義好字段的類型(
double,int,boolean),Spring 的類型轉(zhuǎn)換服務會自動將配置文件中的字符串值(如"1.2")轉(zhuǎn)換成相應的 Java 類型。 - 提供默認值
:${...}:使用冒號:可以在屬性不存在時提供一個默認值。這可以防止因為缺少某個可選配置而導致應用啟動失敗。
方法二:使用 Spring 表達式語言 (SpEL)
@Value 不僅能注入屬性,還能執(zhí)行更強大的 Spring Expression Language (SpEL) 表達式。SpEL 表達式使用 #{...} 語法。
SpEL 可以讓你:
- 引用其他 Bean 的屬性。
- 執(zhí)行方法調(diào)用。
- 進行數(shù)學運算。
- 引用系統(tǒng)屬性等。
一些例子:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class SpelExamples {
// 1. 執(zhí)行簡單的數(shù)學運算
@Value("#{10 * 60}") // 注入 600
private int secondsInTenMinutes;
// 2. 引用另一個Bean的屬性
// 假設容器中有一個名為 appInfoService 的Bean
@Value("#{appInfoService.appName}")
private String anotherAppName;
// 3. 調(diào)用靜態(tài)方法
@Value("#{T(java.lang.Math).random() * 100.0}")
private double randomNumber;
// 4. 引用系統(tǒng)屬性
@Value("#{systemProperties['user.home']}")
private String userHomeDirectory;
// 5. 結(jié)合屬性占位符使用
// 先從配置文件找到 `some.value`,如果不存在則使用 `default`,然后轉(zhuǎn)為大寫
@Value("#{'${some.value:default}'.toUpperCase()}")
private String uppercaseValue;
public void display() {
System.out.println("Seconds in 10 minutes: " + secondsInTenMinutes);
System.out.println("Copied App Name: " + anotherAppName);
System.out.println("Random Number: " + randomNumber);
System.out.println("User Home: " + userHomeDirectory);
System.out.println("Uppercase Value: " + uppercaseValue);
}
}
\${...} vs #{...} 的區(qū)別
這也是個常見的面試題:
\${...}:屬性占位符,主要用于從外部配置文件中獲取值。它是靜態(tài)的,值在應用啟動時就基本確定了。#{...}:SpEL 表達式,用于執(zhí)行動態(tài)的計算和邏輯。它可以在運行時計算出一個值。
方法三:注入硬編碼的字符串
雖然不常用,但你也可以直接注入一個寫死的字符串。
@Value("This is a hardcoded message")
private String message;
這種方式的靈活性很低,通常只在測試或非常簡單的場景下使用。
總結(jié)
| 注入方式 | 語法 | 數(shù)據(jù)來源 | 主要用途 | 靈活性 |
|---|---|---|---|---|
| 屬性占位符 | @Value("${...}") | 配置文件、環(huán)境變量等 | 將外部配置注入代碼,實現(xiàn)代碼與配置解耦。 | 非常高 |
| SpEL 表達式 | @Value("#{...}") | Bean 屬性、方法調(diào)用、運算結(jié)果 | 執(zhí)行動態(tài)計算,實現(xiàn)更復雜的注入邏輯。 | 極高 |
| 硬編碼值 | @Value("...") | 固定的字符串 | 測試或注入不會改變的常量。 | 非常低 |
通過 @Value 注解,Spring IoC 容器不僅能管理對象之間的依賴關系(@Autowired),還能完美地管理對象與外部配置值之間的關系,從而讓我們的應用程序更加健壯、靈活和易于維護。這同樣是控制反轉(zhuǎn)思想的體現(xiàn):組件不再自己去讀取配置文件,而是被動地等待容器將配置值“注入”給它。
以上就是Spring IoC注入一些簡單的值的幾種常見方法的詳細內(nèi)容,更多關于Spring IoC注入值的資料請關注腳本之家其它相關文章!
相關文章
springMVC?@RestControllerAdvice注解使用方式
這篇文章主要介紹了springMVC?@RestControllerAdvice注解使用方式,下面通過一個簡單的示例,演示如何使用?@RestControllerAdvice,感興趣的朋友跟隨小編一起看看吧2024-08-08
MyBatis-Plus通過插件將數(shù)據(jù)庫表生成Entiry,Mapper.xml,Mapper.class的方式
今天小編就為大家分享一篇關于MyBatis-Plus通過插件將數(shù)據(jù)庫表生成Entiry,Mapper.xml,Mapper.class的方式,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02
Java 實戰(zhàn)項目錘煉之在線購書商城系統(tǒng)的實現(xiàn)流程
讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+jsp+mysql+servlet+ajax實現(xiàn)一個在線購書商城系統(tǒng),大家可以在過程中查缺補漏,提升水平2021-11-11
Java使用JDBC實現(xiàn)Oracle用戶認證的方法詳解
這篇文章主要介紹了Java使用JDBC實現(xiàn)Oracle用戶認證的方法,結(jié)合實例形式分析了java使用jdbc實現(xiàn)數(shù)據(jù)庫連接、建表、添加用戶、用戶認證等操作流程與相關注意事項,需要的朋友可以參考下2017-08-08
Java如何實現(xiàn)支付寶電腦支付基于servlet版本
這篇文章主要介紹了Java如何實現(xiàn)支付寶電腦支付基于servlet版本,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-11-11

