日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

理解Spring Boot的ApplicationContextAwareProcessor:擴展點背后的魔法

來源: 責編: 時間:2023-12-05 09:25:28 310觀看
導讀前言這篇文章主要來分享Springboot的擴展點之ApplicationContextAwareProcessor,而ApplicationContextAwareProcessor本身并不是擴展點,而是BeanPostProcessor擴展接口的具體實現,關于BeanPostProcessor擴展接口的功能特

前言

這篇文章主要來分享Springboot的擴展點之ApplicationContextAwareProcessor,而ApplicationContextAwareProcessor本身并不是擴展點,而是BeanPostProcessor擴展接口的具體實現,關于BeanPostProcessor擴展接口的功能特性、實現方式和工作原理可以移步Springboot擴展點之BeanPostProcessor,但是還是要當作Springboot的擴展點來分析,是因為其內部有6個擴展點可供實現,分別是EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware,這幾個接口都是Spring預留的重點擴展實現,與Spring的Bean的生命周期密切相關。JD928資訊網——每日最新資訊28at.com

功能特性

ApplicationContextAwareProcessor本身并不是擴展點,而是實現了BeanPostProcessor,并實現postProcessBeforeInitialization(),所以并不需要去實現它,但是其內部包含了以下6個接口實現的執行時機,這幾個接口的功能作用分別是:JD928資訊網——每日最新資訊28at.com

1、EnvironmentAware:用于獲取Enviroment,Enviroment可以獲得系統內的所有參數;另外也可以通過注入的方式來獲得Environment,用哪種方式需要以實現場景而決定。JD928資訊網——每日最新資訊28at.com

2、EmbeddedValueResolverAware:用于獲取StringValueResolver,StringValueResolver可以獲取基于String類型的properties的變量;另外還可以使用@Value的方式來獲取properties的變量,用哪種方式需要以實現場景而決定。JD928資訊網——每日最新資訊28at.com

3、ResourceLoaderAware:用于獲取ResourceLoader,ResourceLoader可以用于獲取classpath內所有的資源對象。JD928資訊網——每日最新資訊28at.com

4、ApplicationEventPublisherAware:用于獲取ApplicationEventPublisher,ApplicationEventPublisher可以用來發布事件,當然這個對象也可以通過spring注入的方式來獲得,具體的實現方式可以參考Springboot事件監聽機制的實戰應用。JD928資訊網——每日最新資訊28at.com

5、MessageSourceAware:用于獲取MessageSource,MessageSource主要用來做國際化。JD928資訊網——每日最新資訊28at.com

6、ApplicationContextAware:用來獲取ApplicationContext,ApplicationContext就是Spring上下文管理器。JD928資訊網——每日最新資訊28at.com

下面定義一個Bird類,實現ApplicationContextAware接口,以Bird為例分享ApplicationContextAwareProcessor的功能特性。JD928資訊網——每日最新資訊28at.com

@Component@Slf4jpublic class Bird implements ApplicationContextAware {    private String name="xiao niao";    private ApplicationContext applicationContext;    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        this.applicationContext=applicationContext;        log.info("----Spring的上下文環境application被注入");    }}
@Test    public void test3(){        log.info("----單元測試執行開始");        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.fanfu");        log.info("----單元測試執行完畢");    }

單元測執行結果

圖片圖片JD928資訊網——每日最新資訊28at.com

工作原理

注冊時機

ApplicationContextAwareProcessor的注冊時機,即準備BeanFactory的時候,注冊的入口在AbstractApplicationContext#refresh----->AbstractApplicationContext#prepareBeanFactory方法中。JD928資訊網——每日最新資訊28at.com

圖片圖片JD928資訊網——每日最新資訊28at.com

執行邏輯

ApplicationContextAwareProcessor#postProcessBeforeInitialization的擴展邏輯很簡單:即當前Bean是否實現了EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware,如果不是,則直拉返回,如果是,則執行XxxAware接口的擴展邏輯;JD928資訊網——每日最新資訊28at.com

class ApplicationContextAwareProcessor implements BeanPostProcessor {   private final ConfigurableApplicationContext applicationContext;   private final StringValueResolver embeddedValueResolver;      public ApplicationContextAwareProcessor(ConfigurableApplicationContext applicationContext) {      this.applicationContext = applicationContext;      this.embeddedValueResolver = new EmbeddedValueResolver(applicationContext.getBeanFactory());   }   @Override   @Nullable   public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {       //如果非實現EnvironmentAware、EmbeddedValueResolverAware、       //ResourceLoaderAware、ApplicationEventPublisherAware、       //MessageSourceAware、ApplicationContextAware,則直拉返回;      if (!(bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||            bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||            bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)){         return bean;      }      AccessControlContext acc = null;      if (System.getSecurityManager() != null) {         acc = this.applicationContext.getBeanFactory().getAccessControlContext();      }      if (acc != null) {         AccessController.doPrivileged((PrivilegedAction<Object>) () -> {            invokeAwareInterfaces(bean);            return null;         }, acc);      }      else {          //如果實現XXXAware接口,則執行相關Aware接口的擴展方法;         invokeAwareInterfaces(bean);      }      return bean;   }   private void invokeAwareInterfaces(Object bean) {      if (bean instanceof EnvironmentAware) {         ((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());      }      if (bean instanceof EmbeddedValueResolverAware) {         ((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);      }      if (bean instanceof ResourceLoaderAware) {         ((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);      }      if (bean instanceof ApplicationEventPublisherAware) {         ((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);      }      if (bean instanceof MessageSourceAware) {         ((MessageSourceAware) bean).setMessageSource(this.applicationContext);      }      if (bean instanceof ApplicationContextAware) {         ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);      }   }}

執行時機

因為ApplicationContextAwareProcessor實現了BeanPostProcessor接口,并重寫了postProcessBeforeInitialization()。關于BeanPostProcessor接口的執行時機可移步Springboot擴展點之BeanPostProcessor,這里就不再反復贅述了。JD928資訊網——每日最新資訊28at.com

圖片圖片JD928資訊網——每日最新資訊28at.com

總結

通過以上的分析,可以了解到:JD928資訊網——每日最新資訊28at.com

1、ApplicationContextAwareProcessor實現BeanPostProcessor接口,是Spring擴展點之BeanPostProcessor的內部經典實現。JD928資訊網——每日最新資訊28at.com

2、ApplicationContextAwareProcessor#postProcessBeforeInitialization內部邏輯很簡單,主要是執行了XxxAware相關擴展接口具體實現;JD928資訊網——每日最新資訊28at.com

3、ApplicationContextAwareProcessor注冊時機相對比較早,即BeanFactory實例化后,相關屬性初始化時;JD928資訊網——每日最新資訊28at.com

4、ApplicationContextAwareProcessor#postProcessBeforeInitialization的執行時機,是在Spring管理的Bean實例化、屬性注入完成后,InitializingBean#afterPropertiesSet方法以及自定義的初始化方法之前;JD928資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-38123-0.html理解Spring Boot的ApplicationContextAwareProcessor:擴展點背后的魔法

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 特殊線程池ForkJoinPool 要合理運用,不是什么樣的任務都拿來用

下一篇: 如何優雅的組織Golang項目結構

標簽:
  • 熱門焦點
  • vivo TWS Air開箱體驗:真輕 臻好聽

    在vivo S15系列新機的發布會上,vivo的最新款真無線藍牙耳機vivo TWS Air也一同發布,本次就這款耳機新品給大家帶來一個簡單的分享。外包裝盒上,vivo TWS Air保持了vivo自家產
  • 0糖0卡0脂 旭日森林仙草烏龍茶優惠:15瓶到手29元

    旭日森林無糖仙草烏龍茶510ml*15瓶平時要賣為79.9元,今日下單領取50元優惠券,到手價為29.9元。產品規格:0糖0卡0脂,添加草本仙草汁,清涼爽口,富含茶多酚,保留
  • CSS單標簽實現轉轉logo

    轉轉品牌升級后更新了全新的Logo,今天我們用純CSS來實現轉轉的新Logo,為了有一定的挑戰性,這里我們只使用一個標簽實現,將最大化的使用CSS能力完成Logo的繪制與動畫效果。新logo
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 講故事上個月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當時用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反
  • 破圈是B站頭上的緊箍咒

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準追劇女孩們的古偶劇集,2021年有優酷的《山河令》,2022年有愛奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預警不絕,但處于厄爾尼諾大&ldquo;烤&rdquo;之下的除了眾生,還有各大企業發布的ESG報告。ESG是&ldquo;環境保
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯網那些事&ldquo;起猛了,我能看得懂日語了&rdquo;。&ldquo;為什么日本人說話我能聽懂?&rdquo;&ldquo;中文不像中文,日語不像日語,但是我竟然看懂了&rdquo;&hellip;&hell
  • 華為Mate60系列模具曝光:采用碩大圓形后置相機模組+拼接配色方案

    據此前多方爆料,今年華為將開始恢復一年雙旗艦戰略,除上半年推出的P60系列外,往年下半年的Mate系列也將迎來更新,有望在9-10月份帶來全新的華為Mate60
  • 電博會與軟博會實現"線下+云端"的雙線融合

    在本次“電博會”與“軟博會”雙展會利好條件的加持下,既可以發揮展會拉動人流、信息流、資金流實現快速交互流動的作用,繼而推動區域經濟良性發展;又可以聚
Top 主站蜘蛛池模板: 镇赉县| 广宗县| 佛冈县| 滦南县| 尖扎县| 鄂托克旗| 平南县| 聂荣县| 阳信县| 烟台市| 江阴市| 峨眉山市| 三原县| 韶关市| 康保县| 鄂州市| 上虞市| 营山县| 水城县| 江华| 贵州省| 大田县| 莱芜市| 乌拉特后旗| 双桥区| 天津市| 林芝县| 公安县| 丹阳市| 西青区| 锡林浩特市| 贵州省| 青州市| 汾西县| 武川县| 黑水县| 崇仁县| 长顺县| 鸡泽县| 肇东市| 绥宁县|