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

一文看懂 Spring Aware 接口功能

 更新時間:2024年12月24日 12:03:13   作者:齊 飛  
Aware接口是一個空接口,可以理解為是一個標(biāo)記接口,方便在一個統(tǒng)一的方法(AbstractAutowireCapableBeanFactory.invokeAwareMethods)中進(jìn)行判斷處理賦值,在子接口寫出各自的set方法,這篇文章主要介紹了一文看懂 Spring Aware 接口功能,需要的朋友可以參考下

前言

有些情況下,當(dāng)Bean需要實(shí)現(xiàn)某個功能時,需要借助于 Spring容器對象屬性 才能實(shí)現(xiàn)。此時就需要讓該Bean先獲取Spring容器對象屬性,然后借助于Spring容器對象屬性實(shí)現(xiàn)該功能。

  • 為了讓Bean獲取它所在的Spring容器對象屬性,可以讓該Bean實(shí)現(xiàn) 如ApplicationContextAware接口。
  • 通過實(shí)現(xiàn)ApplicationContextAware接口并重寫set方法,Spring容器會自動把上下文環(huán)境對象調(diào)用ApplicationContextAware接口中的setApplicationContext方法,然后就可以通過ApplicationContext對象得到Spring容器中的Bean。
  • 可以將Aware理解為屬性注入,不過不同地方在于,只有實(shí)現(xiàn)了這個接口的bean,當(dāng)spring容器初始化的時候才會自動的將ApplicationContext注入進(jìn)來。

Aware

Aware接口是一個空接口,可以理解為是一個標(biāo)記接口,方便在一個統(tǒng)一的方法(AbstractAutowireCapableBeanFactory.invokeAwareMethods)中進(jìn)行判斷處理賦值,在子接口寫出各自的set方法。

**Aware接口方法的主要作用是讓 Bean 能夠獲取 Spring 容器的相關(guān)資源和信息,以便在后續(xù)的初始化和業(yè)務(wù)邏輯中使用。**可以理解為之前的屬性賦值是將我們自定義屬性的值進(jìn)行賦值,而使用Aware可以讓我們拿到Spring容器內(nèi)部的容器對象。

/*
 * A marker superinterface
 * 在該接口的注釋中也解釋了該接口是一個標(biāo)記接口
 */
public interface Aware {
}

常見的 Aware 接口及功能

BeanNameAware接口

  • 當(dāng)一個 Bean 實(shí)現(xiàn)了BeanNameAware接口時,它可以獲取自己在 Spring 容器中的 Bean 名稱。這個接口中只有一個方法setBeanName(String name),Spring 容器在創(chuàng)建 Bean 的過程中會調(diào)用這個方法,并將 Bean 的名稱作為參數(shù)傳遞進(jìn)去。

ApplicationContextAware接口

  • 實(shí)現(xiàn)這個接口的 Bean 可以獲取 Spring 的應(yīng)用上下文(ApplicationContext)對象。ApplicationContext是 Spring 容器的核心接口,它提供了對容器中所有 Bean 的訪問權(quán)限,還包括獲取資源、發(fā)布事件等多種功能。

BeanFactoryAware接口

  • 與ApplicationContextAware類似,實(shí)現(xiàn)BeanFactoryAware接口的 Bean 可以獲取 Bean 工廠(BeanFactory)對象。BeanFactory是 Spring 容器中用于創(chuàng)建和管理 Bean 的基礎(chǔ)接口,相對ApplicationContext來說更加輕量級。

ApplicationEventPublisherAware接口

  • 如果Bean需要發(fā)布應(yīng)用事件,可以實(shí)現(xiàn)此接口。

ResourceLoaderAware接口

  • 如果Bean需要加載資源文件(如XML文件、屬性文件等),可以實(shí)現(xiàn)此接口。

EnvironmentAware接口

  • 如果Bean需要訪問環(huán)境特定的信息(如配置文件位置、激活的配置文件等),可以實(shí)現(xiàn)此接口。

MessageSourceAware接口

  • 如果Bean需要進(jìn)行國際化處理,可以實(shí)現(xiàn)此接口以獲取消息源。

代碼示例

如:Bean 實(shí)現(xiàn)了 ApplicationContextAware 接口,此時Spring會通過 setApplicationContext() 給Bean中的ApplicationContext屬性值賦值。

org.springframework.context.ApplicationContextAware

public interface ApplicationContextAware extends Aware {
    void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}

通過類實(shí)現(xiàn)ApplicationContextAware接口,并重寫接口中的setApplicationContext()方法,則可以獲取 Spring 的應(yīng)用上下文ApplicationContext對象

public class SpringContextUtil implements ApplicationContextAware {
    private ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
    public ApplicationContext getApplicationContext() {
        return applicationContext;
    }
}

Aware 接口中set()的調(diào)用時機(jī)

在以上代碼中setApplicationContext()方法是spring容器進(jìn)行調(diào)用的,在invokeAwareMethods中統(tǒng)一調(diào)用。
當(dāng)子實(shí)現(xiàn)類實(shí)現(xiàn)ApplicationContextAware接口后,當(dāng)前類中重寫setApplicationContext為接口中setApplicationContext方法。Spring會在執(zhí)行invokeAwareMethods()時由容器進(jìn)行賦值。

Spring源碼中的具體實(shí)現(xiàn)如下:
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeAwareMethods

private void invokeAwareMethods(String beanName, Object bean) {
    //如果 bean 是 Aware 實(shí)例
    if (bean instanceof Aware) {
        //如果bean是BeanNameAware實(shí)例
       if (bean instanceof BeanNameAware) {
           //調(diào)用 bean 的setBeanName方法
          ((BeanNameAware) bean).setBeanName(beanName);
       }
       //如果bean是 BeanClassLoaderAware 實(shí)例
       if (bean instanceof BeanClassLoaderAware) {
           //獲取此工廠的類加載器以加載Bean類(即使無法使用系統(tǒng)classLoader,也只能為null)
          ClassLoader bcl = getBeanClassLoader();
          if (bcl != null) {
              //調(diào)用 bean 的 setBeanClassLoader 方法
             ((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
          }
       }
       //檢查bean是否實(shí)現(xiàn)了BeanFactoryAware,如果是,則調(diào)用其setBeanFactory方法設(shè)置工廠實(shí)例。
       if (bean instanceof BeanFactoryAware) {
          ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
       }
    }
}

什么時候調(diào)用invokeAwareMethods方法

invokeAwareMethods()通常是在Spring容器初始化一個bean的過程中被調(diào)用的。

  • 具體來說,在bean被創(chuàng)建并配置完成后,但還未完全初始化之前(即在init-method或InitializingBean的afterPropertiesSet()方法調(diào)用之前),Spring框架會檢查該bean是否實(shí)現(xiàn)了某些特定的接口,如BeanNameAware、BeanFactoryAware等,并相應(yīng)地調(diào)用這些接口的方法來設(shè)置必要的屬性。
  • 這個過程是Spring框架內(nèi)部的一部分,用來確保bean能夠獲得一些關(guān)于自身或者Spring應(yīng)用上下文的信息。
  • 例如,讓bean知道自己的名字、所屬的BeanFactory或者是類加載器等。這樣可以在bean的生命周期早期給予bean更多的上下文信息。

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

相關(guān)文章

  • Java Swing最詳細(xì)基礎(chǔ)知識總結(jié)

    Java Swing最詳細(xì)基礎(chǔ)知識總結(jié)

    這篇文章主要介紹了Java Swing最詳細(xì)基礎(chǔ)知識總結(jié),文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)Java Swing的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • mybatis-plus分頁查詢?nèi)N方法小結(jié)

    mybatis-plus分頁查詢?nèi)N方法小結(jié)

    本文主要介紹了mybatis-plus分頁查詢?nèi)N方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • java?http請求設(shè)置代理Proxy的兩種常見方法

    java?http請求設(shè)置代理Proxy的兩種常見方法

    代理是一種常見的設(shè)計模式,其目的就是為其他對象提供一個代理以控制對某個對象的訪問,這篇文章主要給大家介紹了關(guān)于java?http請求設(shè)置代理Proxy的兩種常見方法,需要的朋友可以參考下
    2023-11-11
  • 基于Spring Boot使用JpaRepository刪除數(shù)據(jù)時的注意事項(xiàng)

    基于Spring Boot使用JpaRepository刪除數(shù)據(jù)時的注意事項(xiàng)

    這篇文章主要介紹了Spring Boot使用JpaRepository刪除數(shù)據(jù)時的注意事項(xiàng),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 解決spring cloud zuul與nginx的域名轉(zhuǎn)發(fā)問題

    解決spring cloud zuul與nginx的域名轉(zhuǎn)發(fā)問題

    這篇文章主要介紹了spring cloud zuul與nginx的域名轉(zhuǎn)發(fā)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java JSch遠(yuǎn)程執(zhí)行Shell命令的方法

    Java JSch遠(yuǎn)程執(zhí)行Shell命令的方法

    本文主要介紹了Java JSch遠(yuǎn)程執(zhí)行Shell命令,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • java遞歸法求字符串逆序

    java遞歸法求字符串逆序

    這篇文章主要介紹了java遞歸法求字符串逆序,涉及java遞歸調(diào)用的相關(guān)操作技巧,需要的朋友可以參考下
    2015-05-05
  • 阿里云OSS域名配置及簡單上傳的示例代碼

    阿里云OSS域名配置及簡單上傳的示例代碼

    這篇文章主要介紹了阿里云OSS域名配置及簡單上傳的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java easyExcel實(shí)現(xiàn)導(dǎo)入多sheet的Excel

    Java easyExcel實(shí)現(xiàn)導(dǎo)入多sheet的Excel

    這篇文章主要為大家詳細(xì)介紹了如何使用Java easyExcel實(shí)現(xiàn)導(dǎo)入多sheet的Excel,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2025-06-06
  • BCryptPasswordEncoder加密與MD5加密的區(qū)別及說明

    BCryptPasswordEncoder加密與MD5加密的區(qū)別及說明

    這篇文章主要介紹了BCryptPasswordEncoder加密與MD5加密的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評論

翁牛特旗| 临高县| 石景山区| 南雄市| 临洮县| 兖州市| 六安市| 洛隆县| 监利县| 来宾市| 古浪县| 浦东新区| 永德县| 连山| 马边| 临夏市| 河北省| 井冈山市| 太白县| 临夏市| 汤原县| 渝北区| 无锡市| 台中县| 松原市| 宁都县| 武胜县| 车险| 昌图县| 冷水江市| 清水河县| 东宁县| 庐江县| 鹿邑县| 台江县| 南宁市| 桑植县| 昂仁县| 莱西市| 万年县| 青田县|