日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

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

前言

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

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

1入口

從 JavaConfig 中加載配置的 AnnotationConfigApplicationContext 啟動(dòng)方式如下:

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

所以在啟動(dòng)時(shí)也可以直接聲明無(wú)參構(gòu)造,改寫(xiě)為下面這種:

 
 
 
 
  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.  } 

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

無(wú)參構(gòu)造

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

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

因?yàn)?AnnotationConfigApplicationContext 繼承了GenericApplicationContext,所以會(huì)先執(zhí)行父類(lèi)的構(gòu)造方法。

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

DefaultListableBeanFactory

DefaultListableBeanFactory UML

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

下面來(lái)看一下 DefaultListableBeanFactory 里面都有什么?

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

 
 
 
 
  1. /** Map of bean definition objects, keyed by bean name. */ 
  2. // BeanDefinition 的存儲(chǔ) 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 描述了一個(gè) bean 實(shí)例,該實(shí)例具有屬性值,構(gòu)造函數(shù)參數(shù)值以及具體實(shí)現(xiàn)所提供的更多信息。

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

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

2.總結(jié)

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

再回顧一下 DefaultListableBeanFactory 的概念。

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

結(jié)束語(yǔ)

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

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

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


分享題目:初始化容器與 DefaultListableBeanFactory
地址分享:http://m.5511xx.com/article/dhcgodc.html