中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

BeanDefinition的原理是什么

發布時間:2021-12-03 19:32:17 來源:億速云 閱讀:237 作者:柒染 欄目:大數據

這期內容當中小編將會給大家帶來有關BeanDefinition的原理是什么,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

一、BeanDefinition淺析

1. 基本概念了解

首先我提出一個問題:一個java對象和一個Spring Bean有什么區別?

這是一個經典的面試題,什么是java Object?萬物皆對象,在Java內部所有的類,經過創建之后都可以稱之為一個對象,SpringBean也是一個java Object, 但是Spring Bean是脫離于JAVA Object的,為什么這么說呢?因為一個class要想變成對象只需要new一下,就能夠稱之為一個對象,但是一個類要想變成一個Spring Bean就需要經過一系列的生命周期,什么生命周期呢?后面會說到!

至少從上面的可以知道,Spring Bean是一個特殊的Java Object, 那么他肯定有和JAVA Object有不一樣的地方!

Java中 Class對象可以描述一個JAVA Object,但是因為Spring Bean是一個特殊的JAVA Object,所以Class對象不能夠完整的描述一個Spring Bean,所以Spring官方單獨開發了一個叫做BeanDefinition的類,來描述一個SpringBean

     

2. 大致結構

BeanDefinition里面描述了很多的東西,大致如下:

BeanDefinition的原理是什么      
image-20200907164143213

它里面存放了Spring創建bean的過程中所需要的一切原料!

     

3. 他是干嘛的(Spring構建它的優勢)?

  • 提升效率:Spring創建一個類是通過反射創建的,創建類的時候需要一些創建信息,比如Class,比如注解信息等等,事先將這些信息緩存起來,在創建bean的時候能夠直接從緩存中獲取從而達到提升創建效率的目的。
  • 方便修改:spring創建對象的時候,創建的信息全部是通過 BeanDefinition 內存儲的信息來創建對象的,所以,我們可以通過修改BeanDefinition內部特定的值來改變Spring創建對象的結果!
  • 方便擴展:我們通過一些特定的接口,可以獲取到一個類的所有的BeanDefinition信息,從而完成一些特定功能的實現!
     

二、Spring生命周期

通過上面的介紹,那么你對BeanDefinition有了一大概的認識,那么我們在了解整個Spring的聲明周期的時候,需要了解兩個概念BeanFactoryPostProcessorBeanPostProcessor,當然這里只是普及一下概念,是為了能夠讓讀者更加深入的去理解Spring的聲明周期!

     

1. 什么是BeanFactoryPostProcessor?

我們現在通過上面的了解知道了一件事,就是Spring在創建對象之前會把class轉換成一個BeanDefinition , 此時Spring為我們提供了一個擴展點,他可以在讀取完全部的class轉換為 BeanDefinition 之后,回調所有實現了BeanFactoryPostProcessor 接口的實現類,并傳入工廠對象,使得使用者能夠對工廠對象內部的屬性進行修改,例如:對BeanDefinition內的信息進行修改,以達到操縱最終實例化bean的目的!

說白了,他會在掃描完項目將Class轉換為BeanDefinition 之后在進行實例化之前進行接口的回調!

     

2. 什么是BeanPostProcessor?

這個類和上面那個類十分的相似,他有兩個方法,兩個方法的調用時機也不相同,他會在實例化之后,調用初始化方法之前進行第一次方法回調(postProcessBeforeInitialization),在執行完初始化方法之后又會進行一次回調(postProcessAfterInitialization),每次回調該類都會將當前創建好的bean傳遞到方法內部,從而讓開發者能夠自定義的修改當前bean的一些定義!

     

3. Spring生命周期淺析

那么此時,我們了解了BeanDefinitionBeanPostProcessorBeanFactoryPostProcessor這三個概念之后,我們可以嘗試著學習一下Spring的生命周期,學習Spring聲明周期對掌握Spring源碼具有舉足輕重的地位!只有了解Spring的聲明周期,才能夠對后續Spring系列的技術進行一個詳盡的源碼掌握!

整個Spring的生命周期,以文字描述大概分為以下幾個階段:

  1. 初始化bean容器,以方便后續的所有的讀取的信息的存儲!
  2. 初始化內置的class文件轉換為bd
  3. 初始化bean工廠,設置一些默認值!
  4. 向BeanFactory內部注冊一些自己本身內置的Bean后置處理器
  5. 執行項目內置的         BeanFactoryPostProcessor掃描項目將所有的         @Bean、@Component....或者         xml配置等符合Spring讀取對應的類解析成         BeanDefinition,存儲在容器里面!
  6. 執行我們自定義的         BeanFactoryPostProcessor
  7. 注冊所有的         BeanPostProcessor到容器內部!
  8. 初始化國際化資源
  9. 初始化事件資源
  10. 實例化class
  11. 按照規則進行屬性填充(自動注入)
  12. 回調         BeanPostProcessors.postProcessBeforeInitialization方法
  13. 調用bean的初始化方法
  14. 回調         BeanPostProcessors.postProcessAfterInitialization方法
BeanDefinition的原理是什么      
123
     

三、BeanDefinition詳解

     

1. AbstractBeanDefinition

盡管我們可以通過實現BeanDefinition接口創建一個自定義的BeanDefinition,但是你是否發現,自己實現這個接口,想要創建一個BeanDefinition極其復雜里面幾十個屬性都需要你自己去設置;

Spring官方為了簡化這一步驟,提供了一個抽象AbstractBeanDefinition,這個抽象類內部默認實現了BeanDefinition的絕大部分方法,對一些屬性進行了默認值的賦值,極大地簡化了用戶自己實現一個BeanDefinition的難度!

     
I.  GenericBeanDefinition

他是AbstractBeanDefinition的子類,我們通過注解配置的bean以及我們的配置類(除@Bean)外的BeanDefiniton類型都是GenericBeanDefinition類型的!

     
II.  RootBeanDefinition

Spring在啟動時會實例化幾個初始化的BeanDefinition,這幾個BeanDefinition的類型都為RootBeanDefinition,這個包括后續Spring的BeanDefinition會進行一個合并(這都是后話)都是RootBeanDefinition類型的!

我們通過 @Bean創建的BeanDefinition也是RootBeanDefinition類型,當然是屬于他的子類(后面會介紹)的!

     

2. AnnotatedBeanDefinition

這個接口直接繼承了BeanDefinition,他在原來的基礎上擴展了兩個方法:

BeanDefinition的原理是什么      
image-20200907180423084

這兩個方法是專門對注解讀取的方法!所有注解標識的bean都是這個類型的bean!

     
I.  AnnotatedGenericBeanDefinition
BeanDefinition的原理是什么      
image-20200907180954450

第一種情況是配置類也就是標注了@Configuration注解的類會被解析成 AnnotatedGenericBeanDefinition

第二種情況是通過@Import導入的類會被解析成AnnotatedGenericBeanDefinition

     
II. ConfigurationClassBeanDefinition
BeanDefinition的原理是什么      
image-20200907182021917

通過@Bean注解導入的類會被解析為ConfigurationClassBeanDefinition

     
III. ScannedGenericBeanDefinition
BeanDefinition的原理是什么      
image-20200907182139696

通過@Service、@Compent等方式創建的bean 會以ScannedGenericBeanDefinition的形式存在!

上述就是小編為大家分享的BeanDefinition的原理是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

奉新县| 凌海市| 彭州市| 静安区| 邢台市| 佛坪县| 峨眉山市| 收藏| 普兰县| 中牟县| 宝坻区| 彝良县| 临桂县| 绥中县| 紫阳县| 太湖县| 开阳县| 临泉县| 略阳县| 鄂尔多斯市| 牟定县| 定襄县| 微山县| 合山市| 台中县| 东丽区| 拜城县| 墨玉县| 昆明市| 五指山市| 乌鲁木齐市| 文成县| 上蔡县| 瑞安市| 芜湖县| 宝山区| 三河市| 沾益县| 涪陵区| 论坛| 衡阳市|