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

Spring中EnvironmentAware 接口的使用小結(jié)

 更新時(shí)間:2026年04月01日 09:42:48   作者:kevinzeng  
EnvironmentAware 是 Spring 框架中的一個(gè) Aware 回調(diào)接口,本文就來詳細(xì)的介紹一下Spring中EnvironmentAware 接口的使用小結(jié),感興趣的可以了解一下

1. 概念定義

EnvironmentAware 是 Spring 框架中的一個(gè) Aware 回調(diào)接口。它的主要作用是讓 Bean 能夠“感知”到 Spring 容器運(yùn)行時(shí)的環(huán)境配置信息(Environment)。

  • 所屬包:org.springframework.context
  • 核心方法:void setEnvironment(Environment environment)

2. 核心原理與執(zhí)行時(shí)機(jī)

在 Spring Bean 的生命周期中,Aware 接口的注入發(fā)生在 Bean 實(shí)例化之后、初始化方法(如 @PostConstruct 或 init-method)執(zhí)行之前。

執(zhí)行流程:

  1. Spring 容器實(shí)例化 DataSourceAutoConfig。
  2. 容器發(fā)現(xiàn)該類實(shí)現(xiàn)了 EnvironmentAware。
  3. 容器自動調(diào)用 setEnvironment 方法,并將當(dāng)前的 StandardServletEnvironment(或其它實(shí)現(xiàn))作為參數(shù)傳入。
  4. Bean 獲取到 Environment 對象,存入成員變量供后續(xù)邏輯使用。

3. Environment 對象的作用

通過 setEnvironment 獲取到的 Environment 實(shí)例,可以訪問以下三類數(shù)據(jù):

  • Profiles:判斷當(dāng)前激活的是哪個(gè)環(huán)境(如 dev, test, prod)。
  • Properties:獲取 application.properties/yml 中的配置。
  • System Settings:獲取 JVM 系統(tǒng)屬性和操作系統(tǒng)環(huán)境變量。

4. 代碼實(shí)現(xiàn)示例

以下是在自動配置類中常見的用法:

import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DataSourceAutoConfig implements EnvironmentAware {
    private Environment env;
    @Override
    public void setEnvironment(Environment environment) {
        // 保存引用,供后續(xù)使用
        this.env = environment;
    }
    public void someMethod() {
        // 1. 獲取配置屬性
        String dbUrl = env.getProperty("spring.datasource.url");
        // 2. 獲取包含默認(rèn)值的屬性
        Integer timeout = env.getProperty("db.timeout", Integer.class, 1000);
        // 3. 檢查當(dāng)前激活的 Profile
        if (env.acceptsProfiles(org.springframework.core.env.Profiles.of("prod"))) {
            // 執(zhí)行生產(chǎn)環(huán)境特有邏輯
        }
    }
}

5. 為什么不直接用 @Value?

雖然 @Value 更簡潔,但在以下場景 EnvironmentAware 更具優(yōu)勢:

特性@ValueEnvironmentAware / Environment
靈活性靜態(tài)注入,寫死在字段上可以根據(jù)邏輯動態(tài)獲取,甚至遍歷屬性
默認(rèn)值需要在占位符中指定可以通過代碼邏輯靈活處理缺省情況
類型安全依賴 Spring 轉(zhuǎn)換器提供 getProperty(key, targetType) 明確指定類型
復(fù)雜邏輯較難實(shí)現(xiàn)適合需要根據(jù) activeProfiles 切換不同策略的場景

6. 復(fù)習(xí)要點(diǎn)(面試常考)

  • Aware 接口族:記住它和 BeanNameAware, ApplicationContextAware 屬于同一類,都是容器向 Bean 注入基礎(chǔ)設(shè)施資源。
  • 解耦:它讓你的配置類不需要硬編碼,而是根據(jù)外部配置動態(tài)調(diào)整。
  • 進(jìn)階:在 Spring Boot 中,如果需要更高級的屬性綁定(如綁定到對象),通常配合 Binder 類在 setEnvironment 中使用。

在編寫自定義 Starter 或高級配置類時(shí),結(jié)合 EnvironmentAware 和 Binder API 是一種非常專業(yè)的做法。它能讓你像 Spring Boot 內(nèi)部源碼一樣,將 Environment 中的散亂配置自動封裝成一個(gè)標(biāo)準(zhǔn)的 POJO(普通 Java 對象)。

7. 進(jìn)階技巧:結(jié)合 Binder API 實(shí)現(xiàn)屬性批量綁定

在 Spring Boot 2.x 之后,引入了 Binder API。它比原生的 environment.getProperty() 更強(qiáng)大,支持松散綁定(Relaxed Binding,例如 my_prop 綁定到 myProp)和對象嵌套。

7.1 代碼實(shí)現(xiàn)

假設(shè)你有一個(gè)配置類 DataSourceProperties,你想把以 spring.datasource 開頭的屬性全部注入進(jìn)去:

import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DataSourceAutoConfig implements EnvironmentAware {
    private DataSourceProperties properties;
    @Override
    public void setEnvironment(Environment environment) {
        // 1. 獲取 Binder 實(shí)例
        Binder binder = Binder.get(environment);
        // 2. 將指定前綴的配置綁定到具體的對象上
        // 參數(shù) 1: 配置文件中的前綴
        // 參數(shù) 2: 目標(biāo)對象的 Class
        this.properties = binder.bind("spring.datasource", DataSourceProperties.class)
                                .get(); // get() 返回綁定后的對象
        System.out.println("成功綁定配置,數(shù)據(jù)庫地址為: " + properties.getUrl());
    }
}

7.2 為什么要這么做?(對比傳統(tǒng)方案)

  1. 手動綁定的靈活性:雖然 @ConfigurationProperties 也能完成綁定,但在某些場景下(例如:你的配置類需要根據(jù) Environment 中的某個(gè)值動態(tài)決定綁定哪一組前綴),Binder API 提供了代碼級的控制力。
  2. 不依賴 Bean 容器:Binder 可以在 Bean 還沒完全初始化好時(shí),就完成屬性的提取和轉(zhuǎn)換。
  3. 處理復(fù)雜結(jié)構(gòu):Binder 能夠自動處理 List、Map 等復(fù)雜集合的綁定,而普通的 getProperty 只能獲取字符串或簡單類型。

7.3 注意事項(xiàng)

  • 異常處理:bind 方法返回的是一個(gè) BindResult 對象。如果配置不存在,調(diào)用 .get() 會拋出異常。建議在生產(chǎn)代碼中使用 .orElse(new DataSourceProperties()) 提供默認(rèn)值。
  • 依賴:Binder 類位于 spring-boot 包下。如果你是在純 spring-context 環(huán)境(非 Spring Boot)下,則無法使用此 API。

到此這篇關(guān)于Spring中EnvironmentAware 接口的使用小結(jié)的文章就介紹到這了,更多相關(guān)Spring EnvironmentAware 接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA找不到database圖標(biāo)的簡單圖文解決方法

    IDEA找不到database圖標(biāo)的簡單圖文解決方法

    idea是一個(gè)功能十分強(qiáng)大的IDE,大家在使用他進(jìn)行開發(fā)時(shí)候,必不可少的就是連接數(shù)據(jù)庫了,這篇文章主要給大家介紹了關(guān)于IDEA找不到database圖標(biāo)的解決方法,需要的朋友可以參考下
    2024-07-07
  • 淺談Java 中的引用類型

    淺談Java 中的引用類型

    Java開發(fā)者肯定都很熟悉java中的4種引用類型,它們從強(qiáng)到弱分別是:強(qiáng)引用、軟引用、弱引用和虛引用,下面我們詳細(xì)看看這些引用類型
    2020-02-02
  • 如何通過XML方式配置AOP過程解析

    如何通過XML方式配置AOP過程解析

    這篇文章主要介紹了如何通過XML方式配置AOP過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 一文搞懂Java中的序列化與反序列化

    一文搞懂Java中的序列化與反序列化

    序列化是將對象轉(zhuǎn)換成二進(jìn)制字節(jié)流的過程;反序列化是從二進(jìn)制字節(jié)流中恢復(fù)對象的過程。文中降通過示例詳解二者的使用與區(qū)別,需要的可以參考一下
    2022-08-08
  • java實(shí)現(xiàn)五子棋大戰(zhàn)

    java實(shí)現(xiàn)五子棋大戰(zhàn)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)五子棋大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java對象傳遞與返回的細(xì)節(jié)問題詳析

    Java對象傳遞與返回的細(xì)節(jié)問題詳析

    我們知道這是一個(gè)核心概念,在Java中總是按值傳遞而不是按引用傳遞,下面這篇文章主要給大家介紹了關(guān)于Java對象傳遞與返回的細(xì)節(jié)問題的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(30)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(30)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • SpringBoot2 Jpa 批量刪除功能的實(shí)現(xiàn)

    SpringBoot2 Jpa 批量刪除功能的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot2 Jpa 批量刪除功能的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • springboot自定義注解RateLimiter限流注解技術(shù)文檔詳解

    springboot自定義注解RateLimiter限流注解技術(shù)文檔詳解

    文章介紹了限流技術(shù)的概念、作用及實(shí)現(xiàn)方式,通過Spring AOP攔截方法、緩存存儲計(jì)數(shù)器,結(jié)合注解、枚舉、異常類等核心組件,實(shí)現(xiàn)對訪問頻率的控制,旨在防止攻擊、保障系統(tǒng)穩(wěn)定、提升用戶體驗(yàn)及節(jié)約成本
    2025-07-07
  • Java Servlet請求重定向的方法

    Java Servlet請求重定向的方法

    這篇文章主要介紹了使用Java Servlet請求重定向的方法,幫助大家更好的理解和學(xué)習(xí)Java Servlet的相關(guān)知識,感興趣的朋友可以了解下
    2020-11-11

最新評論

霍城县| 麻城市| 工布江达县| 蕲春县| 平顶山市| 霍邱县| 呼和浩特市| 长白| 油尖旺区| 敖汉旗| 新平| 城市| 宜君县| 秭归县| 威海市| 佛学| 龙泉市| 明水县| 哈密市| 汉寿县| 奉新县| 科技| 盐边县| 射阳县| 武功县| 安庆市| 两当县| 同仁县| 油尖旺区| 呼和浩特市| 泉州市| 大悟县| 凌海市| 汤阴县| 华安县| 旅游| 墨竹工卡县| 凤冈县| 玛纳斯县| 玛纳斯县| 平塘县|