欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring IoC注入一些簡(jiǎn)單的值的幾種常見(jiàn)方法

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

我們來(lái)梳理一下最常見(jiàn)的幾種用法:

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

這是最核心的用法。假設(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

# 功能開(kāi)關(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)行類(lèi)型轉(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)值
    // 如果配置文件中沒(méi)有 `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)解讀:

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

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

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

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í)行簡(jiǎn)單的數(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)為大寫(xiě)
    @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è)常見(jiàn)的面試題:

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

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

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

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

這種方式的靈活性很低,通常只在測(cè)試或非常簡(jiǎn)單的場(chǎng)景下使用。

總結(jié)

注入方式語(yǔ)法數(shù)據(jù)來(lái)源主要用途靈活性
屬性占位符@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("...")固定的字符串測(cè)試或注入不會(huì)改變的常量。非常低

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

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

相關(guān)文章

  • 解決spring項(xiàng)目找不到Aspect依賴注解的問(wèn)題

    解決spring項(xiàng)目找不到Aspect依賴注解的問(wèn)題

    這篇文章主要介紹了解決spring項(xiàng)目找不到Aspect依賴注解的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java過(guò)濾器Filter詳解

    Java過(guò)濾器Filter詳解

    這篇文章主要介紹了java過(guò)濾器中Filter,發(fā)送請(qǐng)求時(shí),如果有不符合的信息將會(huì)被filter進(jìn)行攔截,如果符合則會(huì)進(jìn)行放行。如果感興趣可以來(lái)學(xué)習(xí)一下
    2021-08-08
  • Java基礎(chǔ)之容器LinkedList

    Java基礎(chǔ)之容器LinkedList

    這篇文章主要介紹了Java基礎(chǔ)之容器LinkedList,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java編碼輔助工具M(jìn)apstruct用法詳解

    Java編碼輔助工具M(jìn)apstruct用法詳解

    這篇文章主要介紹了Java編碼輔助工具M(jìn)apstruct用法詳解,手動(dòng)編碼setter/getter各個(gè)對(duì)應(yīng)屬性,會(huì)顯得臃腫繁瑣。通過(guò)Mapstruct框架可簡(jiǎn)單方便地完成這一工作。,需要的朋友可以參考下
    2019-06-06
  • Mybatis空值關(guān)聯(lián)的問(wèn)題解析及解決方案

    Mybatis空值關(guān)聯(lián)的問(wèn)題解析及解決方案

    這篇文章給大家介紹了Mybatis空值關(guān)聯(lián)的問(wèn)題解析及解決方案,文中通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • Java實(shí)用工具之使用oshi獲取主機(jī)信息的方法

    Java實(shí)用工具之使用oshi獲取主機(jī)信息的方法

    這篇文章主要介紹了Java實(shí)用工具之使用oshi獲取主機(jī)信息的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • SpringBoot之HttpWebServiceMessageSenderBuilder用法詳解

    SpringBoot之HttpWebServiceMessageSenderBuilder用法詳解

    這篇文章主要介紹了SpringBoot之HttpWebServiceMessageSenderBuilder用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • SpringBoot項(xiàng)目解決跨域的四種方案分享

    SpringBoot項(xiàng)目解決跨域的四種方案分享

    在用SpringBoot開(kāi)發(fā)后端服務(wù)時(shí),我們一般是提供接口給前端使用,但前端通過(guò)瀏覽器調(diào)我們接口時(shí),瀏覽器會(huì)有個(gè)同源策略的限制,即協(xié)議,域名,端口任一不一樣時(shí)都會(huì)導(dǎo)致跨域,這篇文章主要介紹跨域的幾種常用解決方案,希望對(duì)大家有所幫助
    2023-05-05
  • Java 添加、刪除、替換、格式化Word中的文本的步驟詳解(基于Spire.Cloud.SDK for Java)

    Java 添加、刪除、替換、格式化Word中的文本的步驟詳解(基于Spire.Cloud.SDK for Java)

    這篇文章主要介紹了Java 添加、刪除、替換、格式化Word中的文本(基于Spire.Cloud.SDK for Java),本文分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java實(shí)現(xiàn)排球比賽計(jì)分系統(tǒng)

    Java實(shí)現(xiàn)排球比賽計(jì)分系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)排球比賽計(jì)分系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06

最新評(píng)論