欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring 源碼解析CommonAnnotationBeanPostProcessor

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

概述

基于 Spring Framework v5.2.6.RELEASE

前面的幾篇文章,通過源碼分析了 AnnotationConfigApplicationContext 初始化時注冊的兩個關鍵的后處理器 ConfigurationClassPostProcessor 和 AutowiredAnnotationBeanPostProcessor 的作用和工作原理,本文接著介紹第三個關鍵的后處理器 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 的特性,關于 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 平臺重要的技術標準。JSR 由開放組織 JCP(Java Community Process)維護,任何組織成員都可以提出 JSR 提案,以向 Java 平臺提供新的規(guī)范和技術,經(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ù)慣例,還是先從它的類繼承關系下手。

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

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

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

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

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

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

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

總結

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

相關文章

  • JVM性能調優(yōu)實戰(zhàn):讓你的IntelliJ Idea縱享絲滑

    JVM性能調優(yōu)實戰(zhàn):讓你的IntelliJ Idea縱享絲滑

    這篇文章主要介紹了JVM性能調優(yōu)實戰(zhàn):讓你的IntelliJ Idea縱享絲滑的相關資料,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • SpringBoot實現(xiàn)過濾敏感詞的示例代碼

    SpringBoot實現(xiàn)過濾敏感詞的示例代碼

    這篇文章主要為大家詳細介紹了如何利用SpringBoot實現(xiàn)過濾敏感詞功能,文中的示例代碼講解詳細,感興趣的小伙伴可以動手嘗試一下
    2022-08-08
  • java題解LeetCode454.四數(shù)相加示例

    java題解LeetCode454.四數(shù)相加示例

    這篇文章主要為大家介紹了java題解LeetCode454.四數(shù)相加示例思路解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Java實現(xiàn)兩個隨機數(shù)組合并進行排序的方法

    Java實現(xiàn)兩個隨機數(shù)組合并進行排序的方法

    本文主要介紹了Java實現(xiàn)兩個隨機數(shù)組合并進行排序的方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java最常用的6個簡單的計算題

    Java最常用的6個簡單的計算題

    本篇文章給大家整理的在JAVA中最常用到的簡單的計算題,對此有興趣的朋友可以測試參考下。
    2018-02-02
  • Java線程通訊的實現(xiàn)方法總結

    Java線程通訊的實現(xiàn)方法總結

    線程通訊指的是多個線程之間通過共享內存或消息傳遞等方式來協(xié)調和同步它們的執(zhí)行,線程通訊的實現(xiàn)方式主要有以下兩種:共享內存和消息傳遞,本文詳細介紹了Java線程是如何通訊的,感興趣的同學可以參考閱讀
    2023-05-05
  • springboot @Configuration和@Componment的區(qū)別及說明

    springboot @Configuration和@Componment的區(qū)別及說明

    這篇文章主要介紹了springboot @Configuration和@Componment的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java實現(xiàn)赫夫曼樹(哈夫曼樹)的創(chuàng)建

    Java實現(xiàn)赫夫曼樹(哈夫曼樹)的創(chuàng)建

    給定N個權值作為N個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度(WPL)達到最小,稱這樣的二叉樹為最優(yōu)二叉樹,也稱為哈夫曼樹(Huffman Tree)。這篇文章主要就是為大家介紹如何通過Java實現(xiàn)赫夫曼樹,需要的朋友可以參考一下
    2021-12-12
  • Spring boot Rabbitmq消息防丟失實踐

    Spring boot Rabbitmq消息防丟失實踐

    這篇文章主要介紹了Spring boot Rabbitmq消息防丟失實踐,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • springboot項目之相互依賴報錯問題(基于idea)

    springboot項目之相互依賴報錯問題(基于idea)

    這篇文章主要介紹了springboot項目之相互依賴報錯問題(基于idea),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評論