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

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

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

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

前言

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

功能特性

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

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

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

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

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

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

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

下面定義一個Bird類,實現ApplicationContextAware接口,以Bird為例分享ApplicationContextAwareProcessor的功能特性。75p28資訊網——每日最新資訊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("----單元測試執行完畢");    }

單元測執行結果

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

工作原理

注冊時機

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

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

執行邏輯

ApplicationContextAwareProcessor#postProcessBeforeInitialization的擴展邏輯很簡單:即當前Bean是否實現了EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware,如果不是,則直拉返回,如果是,則執行XxxAware接口的擴展邏輯;75p28資訊網——每日最新資訊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,這里就不再反復贅述了。75p28資訊網——每日最新資訊28at.com

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

總結

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

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

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
  • 5月安卓手機好評榜:魅族20 Pro奪冠

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年5月1日至5月31日,僅限國內市場。第一名:魅族20 Pro好評率:97.50%不得不感慨魅族老品牌還
  • 帥氣純真少年!日本最帥初中生選美冠軍出爐

    日本第一帥哥初一生選美大賽冠軍現已正式出爐,冠軍是來自千葉縣的宗田悠良。日本一直熱衷于各種選美大賽,從&ldquo;最美JK&rdquo;起到&ldquo;最美女星&r
  • K6:面向開發人員的現代負載測試工具

    K6 是一個開源負載測試工具,可以輕松編寫、運行和分析性能測試。它建立在 Go 和 JavaScript 之上,它被設計為功能強大、可擴展且易于使用。k6 可用于測試各種應用程序,包括 Web
  • 一篇聊聊Go錯誤封裝機制

    %w 是用于錯誤包裝(Error Wrapping)的格式化動詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數中的一個特殊格式化動詞,用于將一個錯誤(或其他可打印的值)包裝在一個新的錯誤中。使
  • 讓我們一起聊聊文件的操作

    文件【1】文件是什么?文件是保存數據的地方,是數據源的一種,比如大家經常使用的word文檔、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存數據,它既可以保
  • 三分鐘白話RocketMQ系列—— 如何發送消息

    我們知道RocketMQ主要分為消息 生產、存儲(消息堆積)、消費 三大塊領域。那接下來,我們白話一下,RocketMQ是如何發送消息的,揭秘消息生產全過程。注意,如果白話中不小心提到相關代
  • 華為將推出盤古數字人大模型 可幫助用戶12小時完成數字人生成

    在今日舉行的2023年華為云數字文娛AI創新峰會上,華為云全球Marketing與銷售服務總裁石冀琳表示,華為云將在后續推出盤古數字人大模型,可幫助用戶12小
  • 2299元起!iQOO Pad明晚首銷:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發布會,除了首發安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發布會上推出了旗下首款平板電腦——iQOO Pad,其最大的賣點
  • iQOO Neo8 Pro真機諜照曝光:天璣9200+和V1+旗艦雙芯加持

    去年10月,iQOO推出了iQOO Neo7系列機型,不僅搭載了天璣9000+,而且是同價位唯一一款天璣9000+直屏旗艦,一經上市便受到了用戶的廣泛關注。在時隔半年后,
Top 主站蜘蛛池模板: 郯城县| 西和县| 金溪县| 怀远县| 桃江县| 大渡口区| 合水县| 什邡市| 云南省| 东兴市| 磐石市| 嘉义市| 鄂州市| 甘南县| 云南省| 隆安县| 孟村| 江都市| 紫云| 汤原县| 衡东县| 那坡县| 甘孜| 鄯善县| 多伦县| 杭锦后旗| 富裕县| 新河县| 景泰县| 博野县| 龙陵县| 巴青县| 普安县| 平度市| 大庆市| 石屏县| 黄骅市| 鹿邑县| 清河县| 武平县| 珠海市|