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

Spring 源碼解析CommonAnnotationBeanPostProcessor

 更新時間:2022年10月13日 16:02:42   作者:Pseudocode  
這篇文章主要為大家介紹了Spring 源碼解析CommonAnnotationBeanPostProcessor示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

概述

基于 Spring Framework v5.2.6.RELEASE

前面的幾篇文章,通過源碼分析了 AnnotationConfigApplicationContext 初始化時注冊的兩個關(guān)鍵的后處理器 ConfigurationClassPostProcessor 和 AutowiredAnnotationBeanPostProcessor 的作用和工作原理,本文接著介紹第三個關(guān)鍵的后處理器 CommonAnnotationBeanPostProcessor。

以下是 Spring 上下文初始化過程中,CommonAnnotationBeanPostProcessor 被注冊的代碼片段。這段代碼在 AnnotationConfigUtils 類的registerAnnotationConfigProcessors方法中。

registerAnnotationConfigProcessors

// Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
   RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
   def.setSource(source);
   beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
}

從代碼的注釋中可以看到,這個后處理器的作用,是為了適配 JSR-250 的特性,關(guān)于 JSR-250 是什么,會在下文中介紹。

除此之外,除了判斷當前的容器是否已經(jīng)注冊了這個后處理器外,還有一個判斷條件是jsr250Present,這個變量的初始化可以在 AnnotationConfigUtils 類中的靜態(tài)代碼塊里找到:

jsr250Present = ClassUtils.isPresent("javax.annotation.Resource", classLoader);

其實就是看能不能加載到javax.annotation.Resource類型,如果能,則jsr250Present的值就是true。也就是說,如果能加載到javax.annotation.Resource類型,說明當前 Spring 運行的環(huán)境是支持 JSR-250 特性的,只有在這種條件下,Spring 才需要注冊 CommonAnnotationBeanPostProcessor 后處理器。

說了這么多,我們有必要先了解一下 JSR-250 是什么。

JSR 和 JSR-250

JSR 是 Java Specification Requests 的縮寫,意思是「Java 規(guī)范提案」,是 Java 平臺重要的技術(shù)標準。JSR 由開放組織 JCP(Java Community Process)維護,任何組織成員都可以提出 JSR 提案,以向 Java 平臺提供新的規(guī)范和技術(shù),經(jīng)過公開審查和 JCP 執(zhí)行委員會的投票,JSR 會最終成為正式的標準。

JSR-250 的全稱是 Common Annotations for the JavaTM Platform,也就是 Java 平臺的公共注解。這也是本文要介紹的后處理器名字叫 CommonAnnotationBeanPostProcessor 的原因。

參考鏈接:The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 250

JSR-250 注解可以在javax.annotation包下找到。

我們打開其中的一個注解的源碼,比如 Resource 的源碼。

可以看到,注釋中標記了支持該注解的 JDK 起始版本之外,還注明了起始的 Common Annotations 版本。

了解這些之后,我們回到 Spring 的源碼,開始分析 CommonAnnotationBeanPostProcessor 后處理器。

CommonAnnotationBeanPostProcessor 分析

根據(jù)慣例,還是先從它的類繼承關(guān)系下手。

可以看到,它是一個 BeanPostProcessor 的實現(xiàn)類,實現(xiàn)了4個 Bean 后處理器接口,并繼承了 InitDestroyAnnotationBeanPostProcessor 類。

我們再看一下它實現(xiàn)的這些接口中,定義了哪些后處理方法。

要分析 Spring 是如何通過 CommonAnnotationBeanPostProcessor 來支持 JSR-250 特性的,就需要從這些方法下手。我們可以從 CommonAnnotationBeanPostProcessor 和它的父類 InitDestroyAnnotationBeanPostProcessor 的源碼中,查找它們實現(xiàn)了哪些處理方法??偨Y(jié)如下:

CommonAnnotationBeanPostProcessor 主要在postProcessMergedBeanDefinitionpostProcessProperties方法中增加了處理邏輯。InitDestroyAnnotationBeanPostProcessor 則主要在postProcessBeforeInitializationpostProcessBeforeDestruction方法中增加了處理邏輯。

最后,再簡單地介紹一下這幾個后處理方法被調(diào)用的時機:

  • postProcessMergedBeanDefinition 在通過doCreateBean使用反射機制創(chuàng)建 Bean 實例之后調(diào)用。
  • postProcessProperties 在裝配 Bean 實例的屬性前對屬性進行處理。
  • postProcessBeforeInitialization 在 Bean 實例的初始化方法執(zhí)行前被調(diào)用。
  • postProcessBeforeDestruction 在 Bean 實例的銷毀方法執(zhí)行前被調(diào)用。

Spring 主要對@Resource、@PostConstruct@PreDestroy三個 JSR-250 注解提供了支持,其實根據(jù)三個注解的名稱,和以上介紹的幾個后處理方法被調(diào)用的時機,就能知道它們的對應關(guān)系。具體的工作原理,我們放到之后的文章中介紹。

總結(jié)

本文介紹了 CommonAnnotationBeanPostProcessor 后處理器的作用、它主要實現(xiàn)的后處理方法,還順便介紹了 JSR 和 JSR-250 是什么。之后的文章,將深入分析這幾個后處理器方法分別做了哪些工作,更多關(guān)于Spring CommonAnnotationBeanPostProcessor的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

博罗县| 崇义县| 太仆寺旗| 浦东新区| 德昌县| 裕民县| 栾城县| 疏附县| 内丘县| 顺平县| 延庆县| 铁岭市| 靖边县| 泾源县| 宁化县| 法库县| 大厂| 贵港市| 江山市| 涡阳县| 隆化县| 梁河县| 将乐县| 碌曲县| 剑阁县| 黑山县| 连州市| 河曲县| 镇雄县| 修武县| 甘德县| 南京市| 滨海县| 保山市| 小金县| 长汀县| 凤山市| 鸡东县| 岳阳县| 宾川县| 射阳县|