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

Spring 源碼解析CommonAnnotationBeanPostProcessor

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

概述

基于 Spring Framework v5.2.6.RELEASE

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

以下是 Spring 上下文初始化過(guò)程中,CommonAnnotationBeanPostProcessor 被注冊(cè)的代碼片段。這段代碼在 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));
}

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

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

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

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

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

JSR 和 JSR-250

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

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

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

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

我們打開(kāi)其中的一個(gè)注解的源碼,比如 Resource 的源碼。

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

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

CommonAnnotationBeanPostProcessor 分析

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

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

我們?cè)倏匆幌滤鼘?shí)現(xiàn)的這些接口中,定義了哪些后處理方法。

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

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

最后,再簡(jiǎn)單地介紹一下這幾個(gè)后處理方法被調(diào)用的時(shí)機(jī):

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

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

總結(jié)

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

相關(guān)文章

最新評(píng)論

康乐县| 克东县| 太原市| 青神县| 莫力| 中宁县| 密云县| 元谋县| 子洲县| 文山县| 胶南市| 林州市| 桦川县| 平武县| 突泉县| 宝鸡市| 甘南县| 安仁县| 安康市| 分宜县| 玉门市| 辛集市| 阿拉善右旗| 仙游县| 祥云县| 凌海市| 陆良县| 报价| 凤山县| 佛坪县| 土默特右旗| 鹤山市| 宁化县| 公主岭市| 南华县| 岐山县| 潢川县| 方山县| 镇雄县| 尖扎县| 六枝特区|