日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
初始化容器與 DefaultListableBeanFactory

前言

成都網(wǎng)站建設(shè)、做網(wǎng)站介紹好的網(wǎng)站是理念、設(shè)計和技術(shù)的結(jié)合。創(chuàng)新互聯(lián)擁有的網(wǎng)站設(shè)計理念、多方位的設(shè)計風(fēng)格、經(jīng)驗豐富的設(shè)計團(tuán)隊。提供PC端+手機(jī)端網(wǎng)站建設(shè),用營銷思維進(jìn)行網(wǎng)站設(shè)計、采用先進(jìn)技術(shù)開源代碼、注重用戶體驗與SEO基礎(chǔ),將技術(shù)與創(chuàng)意整合到網(wǎng)站之中,以契合客戶的方式做到創(chuàng)意性的視覺化效果。

在前一篇文章:創(chuàng)建 IoC 容器的幾種方式中,介紹了四種方式,這里以 AnnotationConfigApplicationContext 為例,跟進(jìn)代碼,看看 IoC 的啟動流程。

1入口

從 JavaConfig 中加載配置的 AnnotationConfigApplicationContext 啟動方式如下:

進(jìn)去之后發(fā)現(xiàn)構(gòu)造其實是調(diào)用的當(dāng)前無參構(gòu)造。

所以在啟動時也可以直接聲明無參構(gòu)造,改寫為下面這種:

 
 
 
 
  1. public class AnnotationConfigApplicationTest { 
  2.  
  3.  public static void main(String[] args) { 
  4.  
  5.   AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); 
  6.  
  7.   context.register(JavaConfig.class); 
  8.   context.refresh(); 
  9.  
  10.   System.out.println(context.getBean(UserComponent.class)); 
  11.  
  12.  } 

今天就研究研究無參構(gòu)造這一部分究竟做了什么邏輯!

無參構(gòu)造

其中的 StartupStep 是 5.3 新增的類,看代碼注釋的意思是:表示用來記錄啟動過程中的一些指標(biāo)信息等。暫時不做研究。

主要研究紅框部分!注意,這一塊并不代表只有紅框部分!

因為 AnnotationConfigApplicationContext 繼承了GenericApplicationContext,所以會先執(zhí)行父類的構(gòu)造方法。

所以這里會創(chuàng)建一個 DefaultListableBeanFactory 的容器。

DefaultListableBeanFactory

DefaultListableBeanFactory UML

雖然說 Spring 的 BeanFactory 定義了容器的基礎(chǔ)概念、接口方法等,但是 DefaultListableBeanFactory 才是一個真正可以 new 出來的具體的容器,當(dāng)然也可以暫且稱之為 bean 工廠。

下面來看一下 DefaultListableBeanFactory 里面都有什么?

在 DefaultListableBeanFactory 里面會初始化很多參數(shù),其中重點關(guān)注的是下面兩個參數(shù):

 
 
 
 
  1. /** Map of bean definition objects, keyed by bean name. */ 
  2. // BeanDefinition 的存儲 Map 其中 key 為 beanName 
  3. private final Map beanDefinitionMap = new ConcurrentHashMap<>(256); 
  4.  
  5. /** List of bean definition names, in registration order. */ 
  6. // BeanName 的集合 
  7. private volatile List beanDefinitionNames = new ArrayList<>(256); 

其中 BeanDefinition 描述了一個 bean 實例,該實例具有屬性值,構(gòu)造函數(shù)參數(shù)值以及具體實現(xiàn)所提供的更多信息。

對應(yīng)的 beanDefinitionMap 就是存儲的初始化的 beanName 和 BeanDefinition。

至于 BeanDefinition 具體內(nèi)容,下一節(jié)再做介紹。

2.總結(jié)

通過上面的閱讀,可以在初始化流程中增加一部分模塊,即實例化 DefaultListableBeanFactory

再回顧一下 DefaultListableBeanFactory 的概念。

ConfigurableListableBeanFactory 和 BeanDefinitionRegistry 接口的默認(rèn)實現(xiàn):基于bean定義元數(shù)據(jù)的成熟bean工廠,可通過后處理器進(jìn)行擴(kuò)展。重點需要把握的是 DefaultListableBeanFactory 內(nèi)部定義了 BeanDefinition 的 Map。

結(jié)束語

本文從入口開始,進(jìn)入到構(gòu)造,主要介紹了 DefaultListableBeanFactory 的創(chuàng)建,及創(chuàng)建時初始化了一堆參數(shù)。

考慮到文章篇幅問題,盡量避免大段大段的貼代碼以及注釋,有興趣的小伙伴可以試著自己搭建源碼構(gòu)建環(huán)境,然后 Debug 走一走,這樣也可以互相探討,共同學(xué)習(xí)。

本文轉(zhuǎn)載自微信公眾號「程序員小航」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系程序員小航公眾號。


當(dāng)前文章:初始化容器與 DefaultListableBeanFactory
鏈接分享:http://www.dlmjj.cn/article/dhcgodc.html