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

Spring IoC注入一些簡單的值的幾種常見方法

 更新時(shí)間:2025年07月10日 10:53:14   作者:冰糖心書房  
這篇文章主要介紹了Spring IoC注入一些簡單的值的幾種常見方法:屬性占位符(從配置文件獲取值,高靈活性)、SpEL表達(dá)式(動(dòng)態(tài)計(jì)算,極高靈活性)及硬編碼值(固定字符串,低靈活性),體現(xiàn)控制反轉(zhuǎn)思想,提升應(yīng)用配置管理的靈活性與可維護(hù)性,需要的朋友可以參考下

我們來梳理一下最常見的幾種用法:

方法一:注入配置文件中的屬性(最常用)

這是最核心的用法。假設(shè)我們有一個(gè)標(biāo)準(zhǔn)的 Spring Boot 項(xiàng)目,其配置文件 application.properties 內(nèi)容如下:

src/main/resources/application.properties

# 應(yīng)用信息
app.name=My Awesome App
app.version=1.2

# 作者信息
author.name=Alice
author.email=alice@example.com

# 功能開關(guān)和配置
feature.email.enabled=true
max.pool.size=100

現(xiàn)在,我們想創(chuàng)建一個(gè) AppInfoService 組件,并將這些配置值注入進(jìn)去。

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會(huì)自動(dòng)進(jìn)行類型轉(zhuǎn)換)
    @Value("${app.version}")
    private double appVersion;

    @Value("${max.pool.size}")
    private int maxPoolSize;

    // 3. 注入布爾值
    @Value("${feature.email.enabled}")
    private boolean isEmailEnabled;

    // 4. 提供默認(rèn)值
    // 如果配置文件中沒有 `app.description`,則使用默認(rèn)值 "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);
    }
}

關(guān)鍵點(diǎn)解讀:

  • 語法 \${...}:這是屬性占位符 (Property Placeholder)。它告訴 Spring:“請到我的環(huán)境配置(包括 application.properties、系統(tǒng)變量、JVM參數(shù)等)中去查找 ... 這個(gè)鍵,并把它的值注入進(jìn)來。”
  • 自動(dòng)類型轉(zhuǎn)換:你只需要定義好字段的類型(double, int, boolean),Spring 的類型轉(zhuǎn)換服務(wù)會(huì)自動(dòng)將配置文件中的字符串值(如 "1.2")轉(zhuǎn)換成相應(yīng)的 Java 類型。
  • 提供默認(rèn)值 :${...}:使用冒號(hào) : 可以在屬性不存在時(shí)提供一個(gè)默認(rèn)值。這可以防止因?yàn)槿鄙倌硞€(gè)可選配置而導(dǎo)致應(yīng)用啟動(dòng)失敗。

方法二:使用 Spring 表達(dá)式語言 (SpEL)

@Value 不僅能注入屬性,還能執(zhí)行更強(qiáng)大的 Spring Expression Language (SpEL) 表達(dá)式。SpEL 表達(dá)式使用 #{...} 語法。

SpEL 可以讓你:

  • 引用其他 Bean 的屬性。
  • 執(zhí)行方法調(diào)用。
  • 進(jìn)行數(shù)學(xué)運(yùn)算。
  • 引用系統(tǒng)屬性等。

一些例子:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class SpelExamples {

    // 1. 執(zhí)行簡單的數(shù)學(xué)運(yùn)算
    @Value("#{10 * 60}") // 注入 600
    private int secondsInTenMinutes;

    // 2. 引用另一個(gè)Bean的屬性
    // 假設(shè)容器中有一個(gè)名為 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ū)別
這也是個(gè)常見的面試題:

  • \${...}屬性占位符,主要用于從外部配置文件中獲取值。它是靜態(tài)的,值在應(yīng)用啟動(dòng)時(shí)就基本確定了。
  • #{...}SpEL 表達(dá)式,用于執(zhí)行動(dòng)態(tài)的計(jì)算和邏輯。它可以在運(yùn)行時(shí)計(jì)算出一個(gè)值。

方法三:注入硬編碼的字符串

雖然不常用,但你也可以直接注入一個(gè)寫死的字符串。

@Value("This is a hardcoded message")
private String message;

這種方式的靈活性很低,通常只在測試或非常簡單的場景下使用。

總結(jié)

注入方式語法數(shù)據(jù)來源主要用途靈活性
屬性占位符@Value("${...}")配置文件、環(huán)境變量等將外部配置注入代碼,實(shí)現(xiàn)代碼與配置解耦。非常高
SpEL 表達(dá)式@Value("#{...}")Bean 屬性、方法調(diào)用、運(yùn)算結(jié)果執(zhí)行動(dòng)態(tài)計(jì)算,實(shí)現(xiàn)更復(fù)雜的注入邏輯。極高
硬編碼值@Value("...")固定的字符串測試或注入不會(huì)改變的常量。非常低

通過 @Value 注解,Spring IoC 容器不僅能管理對象之間的依賴關(guān)系(@Autowired),還能完美地管理對象與外部配置值之間的關(guān)系,從而讓我們的應(yīng)用程序更加健壯、靈活和易于維護(hù)。這同樣是控制反轉(zhuǎn)思想的體現(xiàn):組件不再自己去讀取配置文件,而是被動(dòng)地等待容器將配置值“注入”給它。

以上就是Spring IoC注入一些簡單的值的幾種常見方法的詳細(xì)內(nèi)容,更多關(guān)于Spring IoC注入值的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java springboot 整合 Nacos的實(shí)例代碼

    Java springboot 整合 Nacos的實(shí)例代碼

    這篇文章主要介紹了Java springboot 整合 Nacos的實(shí)例,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • jdk自帶定時(shí)器使用方法詳解

    jdk自帶定時(shí)器使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了jdk自帶定時(shí)器的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • SpringBoot整合XXLJob的實(shí)現(xiàn)示例

    SpringBoot整合XXLJob的實(shí)現(xiàn)示例

    XXLJob是大眾點(diǎn)評開源的分布式任務(wù)調(diào)度平臺(tái),支持Cron、固定間隔等觸發(fā)方式,本文主要介紹了SpringBoot整合XXLJob的實(shí)現(xiàn)示例,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-09-09
  • springMVC?@RestControllerAdvice注解使用方式

    springMVC?@RestControllerAdvice注解使用方式

    這篇文章主要介紹了springMVC?@RestControllerAdvice注解使用方式,下面通過一個(gè)簡單的示例,演示如何使用?@RestControllerAdvice,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • MyBatis-Plus通過插件將數(shù)據(jù)庫表生成Entiry,Mapper.xml,Mapper.class的方式

    MyBatis-Plus通過插件將數(shù)據(jù)庫表生成Entiry,Mapper.xml,Mapper.class的方式

    今天小編就為大家分享一篇關(guān)于MyBatis-Plus通過插件將數(shù)據(jù)庫表生成Entiry,Mapper.xml,Mapper.class的方式,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • SpringBoot2新特性 自定義端點(diǎn)詳解

    SpringBoot2新特性 自定義端點(diǎn)詳解

    這篇文章主要介紹了SpringBoot2新特性 自定義端點(diǎn)詳解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java 實(shí)戰(zhàn)項(xiàng)目錘煉之在線購書商城系統(tǒng)的實(shí)現(xiàn)流程

    Java 實(shí)戰(zhàn)項(xiàng)目錘煉之在線購書商城系統(tǒng)的實(shí)現(xiàn)流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+jsp+mysql+servlet+ajax實(shí)現(xiàn)一個(gè)在線購書商城系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • Java使用JDBC實(shí)現(xiàn)Oracle用戶認(rèn)證的方法詳解

    Java使用JDBC實(shí)現(xiàn)Oracle用戶認(rèn)證的方法詳解

    這篇文章主要介紹了Java使用JDBC實(shí)現(xiàn)Oracle用戶認(rèn)證的方法,結(jié)合實(shí)例形式分析了java使用jdbc實(shí)現(xiàn)數(shù)據(jù)庫連接、建表、添加用戶、用戶認(rèn)證等操作流程與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-08-08
  • Java如何實(shí)現(xiàn)支付寶電腦支付基于servlet版本

    Java如何實(shí)現(xiàn)支付寶電腦支付基于servlet版本

    這篇文章主要介紹了Java如何實(shí)現(xiàn)支付寶電腦支付基于servlet版本,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 詳解SpringBoot健康檢查的實(shí)現(xiàn)原理

    詳解SpringBoot健康檢查的實(shí)現(xiàn)原理

    這篇文章主要介紹了詳解SpringBoot健康檢查的實(shí)現(xiàn)原理,幫助大家更好的理解和學(xué)習(xí)使用SpringBoot框架,感興趣的朋友可以了解下
    2021-03-03

最新評論

浮山县| 枣庄市| 高要市| 晋州市| 布拖县| 始兴县| 河曲县| 德昌县| 临夏市| 湟中县| 郴州市| 右玉县| 天全县| 开封县| 彰化县| 沈丘县| 合作市| 前郭尔| 阿瓦提县| 浦江县| 呼玛县| 曲沃县| 恩施市| 漠河县| 大竹县| 洪湖市| 墨脱县| 青阳县| 会昌县| 巨鹿县| 桦甸市| 莱西市| 双江| 丰台区| 十堰市| 绵竹市| 玉林市| 鲁山县| 拜泉县| 林口县| 西和县|