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 主要在postProcessMergedBeanDefinition
和postProcessProperties
方法中增加了處理邏輯。InitDestroyAnnotationBeanPostProcessor 則主要在postProcessBeforeInitialization
和postProcessBeforeDestruction
方法中增加了處理邏輯。
最后,再簡單地介紹一下這幾個后處理方法被調用的時機:
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縱享絲滑的相關資料,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01Java實現(xiàn)兩個隨機數(shù)組合并進行排序的方法
本文主要介紹了Java實現(xiàn)兩個隨機數(shù)組合并進行排序的方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09springboot @Configuration和@Componment的區(qū)別及說明
這篇文章主要介紹了springboot @Configuration和@Componment的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06Java實現(xiàn)赫夫曼樹(哈夫曼樹)的創(chuàng)建
給定N個權值作為N個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度(WPL)達到最小,稱這樣的二叉樹為最優(yōu)二叉樹,也稱為哈夫曼樹(Huffman Tree)。這篇文章主要就是為大家介紹如何通過Java實現(xiàn)赫夫曼樹,需要的朋友可以參考一下2021-12-12